面试题60. n个骰子的点数(一般)

从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。

示例 1:

输入: [1,2,3,4,5]
输出: True

示例 2:

输入: [0,0,1,2,5]
输出: True

限制:

数组长度为 5

数组的数取值为 [0, 13] .

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bu-ke-pai-zhong-de-shun-zi-lcof

思路1:

注意大小王是可以随配的

可以走个捷径,判断最大值与最小值的差大于小于5,小于5,肯定是同花顺,但是要注意先排序,判断最后一个大小王,

思路2:

同思路1,只是将排序换成set进行去重

dp[i] [j]表示掷i个骰子,出现j点数的次数

转移方程为

dp[i] [s] += dp[i-1] [s-j];//转移方程 ,当前n个骰子出现的点数之和等于前一次出现的点数之和加上这一次出现的点数

回看记录200726

这个思路真的太优秀了,1,判断大小王个数,2,如果中间出现其他相同数字表示不能出现顺子,3,如果这个数组最后一个数减去除了0之外的第一个数小于5,那么就是顺子(这个顺子要求可以是不连续的)

代码1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public boolean isStraight(int[] nums) {
//注意大小王是可以任意配的
int count=0;
Arrays.sort(nums);//数组排序
for(int i=0;i<4;i++){
if(nums[i]==0)
count++;
else if(nums[i]==nums[i+1])
return false;//有重复的
}
return nums[4]-nums[count]<5;//max-min<5,这个表达式是精华
}
}

代码2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public boolean isStraight(int[] nums) {
//使用set
Set<Integer> set = new HashSet<>();
int max =0,min = 14;
for(int num :nums){
if(num==0) continue;
max = Math.max(max,num);
min = Math.min(min,num);
if(set.contains(num))
return false;
set.add(num);
}
return max-min<5;
}
}