• 【LeetCode】【剑指offer】【n个骰子的点数】


    剑指 Offer 60. n个骰子的点数

    把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。

    你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。

    示例 1:

    输入: 1
    输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]
    示例 2:

    输入: 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 <= 11

    来源:力扣(LeetCode
    链接:https://leetcode.cn/problems/nge-tou-zi-de-dian-shu-lcof
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    这是一个骰子的概率

    1/61/61/61/61/61/6

    这是两个骰子的概率 

    1/362/363/364/365/366/365/364/363/362/361/36

    也就是说我们一个的骰子产生的结果分别为1,2,3,4,5,6

    而我们两个 骰子产生的结果分别为2,3,4,5,6,7,8,9,10,11,12,

    其中2的概率与一个骰子中的1的概率有关,

    3的概率与一个骰子中的1,2的概率有关,

    4的概率与一个骰子中的1,2,3的概率有关

    5的概率与一个骰子中的1,2,3,4的概率有关

    6的概率与一个骰子中的1,2,3,4,5的概率有关

    7的概率与一个骰子中的1,2,3,4,5,6的概率有关

    8的概率与一个骰子中的2,3,4,5,6的概率有关

    9的概率与一个骰子中的3,4,5,6的概率有关

    10的概率与一个骰子中的4,5,6的概率有关

    11的概率与一个骰子中的5,6的概率有关

    12的概率与一个骰子中的6的概率有关

    下面是三颗骰子的情况

    1/216

    2/216

    3/216

    4/216

    5/216

    6/216

    5/216

    4/216

    3/216

    2/216

    1/216

     

    3456789101112131415161718

    1/216

    2/216

    3/216

    4/216

    5/216

    6/216

    5/216

    4/216

    3/216

    2/216

    1/216

    1/216

    2/216

    3/216

    4/216

    5/216

    6/216

    5/216

    4/216

    3/216

    2/216

    1/216

    1/216

    2/216

    3/216

    4/216

    5/216

    6/216

    5/216

    4/216

    3/216

    2/216

    1/216

    1/216

    2/216

    3/216

    4/216

    5/216

    6/216

    5/216

    4/216

    3/216

    2/216

    1/216

    1/216

    2/216

    3/216

    4/216

    5/216

    6/216

    5/216

    4/216

    3/216

    2/216

    1/216

    1/216

    2/216

    3/216

    4/216

    5/216

    6/216

    5/216

    4/216

    3/216

    2/216

    1/216

    1/2163/2166/21610/21615/21621/21625/21627/21627/21625/21621/21615/21610/2166/2163/2161/216

     

     

     

     

     

     

     对于上面的结果我们拿两颗骰子投出3来举例,3的话需要原来的一个骰子投出1或2,也就是1/6和1/6的概率,并且需要我们第二颗骰子投出对应的2和1,也就是1/6和1/6的概率,对应的情况相乘,就能得到1/36和1/36的概率。

    如果是三颗骰子我们想要投出3的话,我们就需要前面的两颗骰子都是投出2的情况再乘上我们第三颗骰子投出1的概率,也就是1/36再乘上1/6也就是1/216的概率。

     所以我们只需要将我们上一次骰子的结果除以6然后再一个新的长度为5*i+1的容器中,从头开始遍历我们上一次的骰子的结果个数次,将我们的数据按照上面的形式相加,然后迭代n-1轮,就能够得到我们想要的结果

    1. class Solution {
    2. public:
    3. vector<double> dicesProbability(int n) {
    4. //创建一个初始的一个骰子的结果,就是6个1/6的概率
    5. vector<double> result (6,1.0/6.0);
    6. //由于一个骰子的结果我们初始就是,所以我们下面计算2个及以上的骰子形成的概率
    7. for(int i=2;i<=n;i++)
    8. {
    9. //创建一个大小为5*i+1的容器,也就是我们的n个骰子的结果个数作为容器的大小
    10. //每增加一个骰子就会增加6情况,减少1种情况
    11. vector<double> tmp(5*i+1);
    12. for(int j=0;jsize();j++)
    13. {
    14. for(int k=0;k<6;k++)
    15. {
    16. //将我们原有的概率总数除以6
    17. //因为要是不考虑重复结果的话,1个骰子有6种情况
    18. //两个骰子有36种情况,以此类推
    19. tmp[j+k]+=result[j]/6.0;
    20. }
    21. }
    22. //迭代我们的result
    23. result=tmp;
    24. }
    25. return result;
    26. }
    27. };
  • 相关阅读:
    C# 如何判断字符串最后一位是不是逗号
    基于Java+SpringBoot制作一个社区宠物登记小程序
    Android问题笔记 - kotlin中使用Java接口,报错Parameter specified as non-null is null 快速解决
    MySQL:存储引擎
    【经验贴-leetcode报错没头绪时的小妙招(非会员)】
    c++新年好和通信路线(acwing)
    Chat2DB下载、以及AI功能使用
    面试官:请用SQL模拟一个死锁
    新手买电视盒子哪个好?数码粉实测电视盒子排名
    ELK企业级日志分析系统
  • 原文地址:https://blog.csdn.net/weixin_62684026/article/details/126466327