中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

LeetCode如何求n個骰子的點數

發布時間:2021-12-15 13:56:25 來源:億速云 閱讀:130 作者:小新 欄目:大數據

這篇文章主要介紹了LeetCode如何求n個骰子的點數,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

題目描述

把 n 個骰子扔在地上,所有骰子朝上一面的點數之和為 s。輸入 n,打印出 s 的所有可能的值出現的概率。

你需要用一個浮點數數組返回答案,其中第 i 個元素代表這 n 個骰子所能擲出的點數集合中第 i 小的那個的概率。

  • 1 <= n <= 11
                     

題目樣例

                     

示例

  • 輸入: 1

  • 輸出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]

  • 輸入: 2

  • 輸出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111,0.08333,0.05556,0.02778]

                     

題目思考

  1. 可以根據 n 個骰子的概率推導出 n+1 個骰子的概率嗎
                     

解決方案

                     
思路
  • 分析題目, 先從 1 個骰子的最簡單情況出發, 顯然點數為 1~6 的概率都是 1/6
  • 那如果是 2 個骰子呢? 假設第一個骰子點數為 1, 第二個可以是 1~6, 兩者之和就是 2~7; 而如果第一個點數為 2, 那么兩者之和就是 3~8, 以此類推
  • 顯然 2 個骰子點數之和為 2 的概率是                         (1/6)*(1/6)=1/36, 只有 1+1 一種情況; 而點數之和為 3 的概率是                         1/36+1/36=1/18, 有 1+2 和 2+1 兩種情況, 以此類推
  • 所以如果我們使用一個字典來保存當前骰子數 n 的每個點數之和的概率, 即鍵值對是                         {點數和:概率}, 那么對于 n+1 而言, 我們只需要對每個點數之和加上 1~6 作為新的點數之和, 將原有概率乘以 1/6 累加到新的點數和對應的概率上即可
  • 最后只需要根據有效點數之和從小到大, 將字典中的值依次存入最終結果中
  • 對于 n 個骰子而言, 其點數之和最小為 n (每個骰子點數都是 1), 最大為                         6*n (每個骰子點數都是 6)
  • 下面代碼對必要的步驟有詳細的解釋, 方便大家理解
                     
復雜度
  • 時間復雜度 O(N^2): 兩層循環, 外層遍歷 N 個數, 內層遍歷                         5N*6 個數
  • 空間復雜度 O(N): 字典中需要存 5N 個鍵值對
                     
代碼
import collections


class Solution:
    def twoSum(self, n: int) -> List[float]:
        # DP, dp為當前的點數和=>概率的字典, 初始化dp[0] = 1, 代表0個骰子時點數之和為0的概率為1
        # 增加一個骰子后, 我們只需要對原來字典的每個點數之和加上 1~6 作為新的點數之和, 并將原有概率乘以 1/6 累加到新的點數和對應的概率上即可
        dp = {}
        dp[0] = 1
        for i in range(1, n + 1):
            newdp = collections.defaultdict(int)
            for sm in dp:
                for v in range(1, 7):
                    # 增加一個骰子后, 累加其概率到新的點數和上
                    newdp[sm + v] += dp[sm] / 6
            dp = newdp
        res = []
        for sm in range(n, 6 * n + 1):
            # 將值依次存入結果中
            res.append(dp[sm])
        return res

感謝你能夠認真閱讀完這篇文章,希望小編分享的“LeetCode如何求n個骰子的點數”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

墨玉县| 申扎县| 临泉县| 日照市| 民权县| 南陵县| 白玉县| 将乐县| 丰宁| 巩义市| 眉山市| 绥芬河市| 西峡县| 勐海县| 甘肃省| 贵溪市| 定远县| 晋江市| 祁门县| 满洲里市| 上栗县| 南靖县| 江都市| 葫芦岛市| 宁强县| 丹寨县| 平武县| 连城县| 固安县| 昭觉县| 阜宁县| 剑阁县| 台州市| 仁怀市| 阿荣旗| 惠东县| 泽库县| 南昌市| 信丰县| 大邑县| 临洮县|