leetcode —— 面试题60. n个骰子的点数
把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。
示例 1:
输入: 1
输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/nge-tou-zi-de-dian-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
————————————————
解题思路一:使用递归,要求n个骰子的点数和,可以先求n-1棵骰子的点数和,通过递归可以计算每种点数和的数量,然后存在列表中。
class Solution:def twoSum(self, n: int) -> List[float]:if n<1:return []max_sum = n*6 # n个骰子的最大点数prob = [0 for _ in range(max_sum-n+1)] # n个骰子的所有可能点数def probablity(n1,prob): # 计算n1个骰子的所有情况for i in range(1,7):probablities(n1,n2,i,prob) # n1是骰子个数,n2是当前是第几个骰子,i是当前骰子值之和,prob用于存储不同点数的个数 def probablities(n1,n2,sums,prob): # 递归函数if n2==1: # 停止递归条件prob[sums-n1]+=1 # 对应点数位置加1,减去n1的目的是因为n1前的值不可能取到else:for i in range(1,7):probablities(n1,n2-1,sums+i,prob)probablity(n,prob) # 获得所有点数的个数情况total = 6**n # 一共会有多少种组合num = [] # 记录不同点数的概率for n in prob:num.append(n/total)return num
解题思路2:在下一轮循环中,我们加上一个新的骰子,此时和为n的骰子出现的次数应该等于上一轮循环中骰子点数和为n-1、n-2、n-3、n-4、n-5与n-6的次数的总和,所以我们使用另一个数组的第n个数字设为前一个数组对应的第n-1、n-2、n-3、n-4、n-5与n-6个数字之和。
其Python代码如下:
class Solution:def twoSum(self, n: int) -> List[float]:max_num = n*6 # n个骰子的最大值nums = [[0 for _ in range(max_num)] for _ in range(n)] # 初始化骰子状态,用n个数组for i in range(0,6): # 初始化一个骰子的状态nums[0][i] = 1for i in range(1,n): # 从第二个骰子开始更新状态for j in range(i,(i+1)*6): # 第i个骰子的取值范围为i到(i+1)*6for k in range(1,7): # 取对应骰子位置的前6个值if j-k<0: # 如果前六个值的索引小于0break # 跳出循环nums[i][j]+=nums[i-1][j-k] total = 6**n # 计算每种值的概率pro = []for nn in nums[n-1][n-1:]:pro.append(nn/total)return pro
leetcode —— 面试题60. n个骰子的点数相关推荐
- 剑指Offer - 面试题60. n个骰子的点数(动态规划)
1. 题目 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率. 你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 ...
- 【LeetCode】剑指 Offer 60. n个骰子的点数
[LeetCode]剑指 Offer 60. n个骰子的点数 文章目录 [LeetCode]剑指 Offer 60. n个骰子的点数 package offer;import java.util.Ar ...
- 剑指 Offer 60. n个骰子的点数(动态规划)
[剑指 Offer 60. n个骰子的点数] 思路: \qquad题目其实不难,写这篇博客主要是记录下C++使用vector开多维数组. \qquad思路类似于走台阶,每次可以走1,2,3阶,问到每一 ...
- java 6面骰子_《剑指offer》 面试题43 n个骰子的点数 (java)
引言:写这篇文章的初衷只是想做个笔记,因为这道题代码量有点大,有点抽象,而书上并没有详细的注释.为了加深印象和便于下次复习,做个记录. 原题:把n个骰子扔到地上,所有骰子朝上一面的点数之后为s. 输入 ...
- 【面试题】n个骰子的点数(动态规划法)
题目描述 动态规划 class Solution {public double[] twoSum(int n) {// pre[]记录前 n-1个骰子的点数概率数组,初始只有一个骰子,点数概率数组显然 ...
- 97. Leetcode 剑指 Offer 60. n个骰子的点数 (动态规划-背包问题)
步骤一.确定状态: 确定dp数组及下标含义 dp数组是一维,大小是[6*n+1], 这里要注意下,背包的容量会和物品的重量 有关系了,投掷n枚的骰子,背包的容量范围是[n,6n],用2枚想一下,出现的 ...
- 【LeetCode笔记】剑指 Offer 60. n个骰子的点数(Java、动态规划)
文章目录 题目描述 代码 & 思路 1. 二维数组(方便理解) 2. 一维数组(节约空间) 二刷 鸽了好久的打题博客-要继续补起来了! 今天不打题,明天变垃圾 QAQ 题目描述 一眼就想先暴力 ...
- 剑指 Offer 60. n个骰子的点数
文章目录 题目地址 代码 递推公式 空间优化 运行结果通过 题目地址 力扣https://leetcode-cn.com/problems/nge-tou-zi-de-dian-shu-lcof/ 代 ...
- java 取数组的前90位,LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面
LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面 题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入 ...
最新文章
- 图像处理、语音处理的应用及前沿技术_人工智能,虚拟技术,语音识别技术在我们的生活中...
- linux两个网段默认网关_Linux下配置多网卡多网关
- js实现的tooltip简单小组件
- 百度地图与谷歌地图 (常识、区别,更倾向于使用百度地图,纠错信息比谷歌多)...
- 解题报告:hdu 1556 Color the ball(区间修改,单点查询)
- Docker学习笔记 - Docker容器的日志
- 与机器人对话的语音识别解决方案
- Cesium Terrain Builder 非压缩瓦片
- 会玩弹珠也可以拿来炫了?是的,这个技能燃爆了!
- Android图书馆选座系统课程设计
- c语言程序设计考试流程图,c语言程序设计流程图详解.pdf
- 用continue计算100以内奇数和_一分钟明白break和continue
- ISIS协议的基础配置实验,原来做ISIS基础配置还可以这么有趣
- Color颜色——颜色模式、颜色基本特征、网页颜色以及其代码
- 2013年台式计算机型号,2013cpu天梯图,台式机处理器天梯图
- 【无标题】VisualStudio2022断点调试
- 【es】es界面化管理工具cerebro的安装和使用
- usb声卡驱动(六):usb声卡中的pcm打开和关闭
- server服务(hander传值)
- 用网线实现两台电脑之间的大文件传输(使用电脑备份)