思考:
从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。
2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。
A 不能视为 14。
-------------
示例:
输入:[1,2,3,4,5]
输出:True
输入:[0,0,1,2,5]
输出:True
限制:
数组长度为 5
数组的数取值为 [0,13].----------------
思考:
根据题意,此 5 张牌是顺子的 充分条件 如下:
除大小王外,所有牌 无重复 ;
设此 5 张牌中最大的牌为 max ,最小的牌为 min (大小王除外),则需满足:
max - min <5
因而,可将问题转化为:此 5 张牌是否满足以上两个条件?
集合 Set+ 遍历
遍历五张牌,遇到大小王(即 0 )直接跳过。
判别重复: 利用 Set 实现遍历判重, Set 的查找方法的时间复杂度为 O(1) ;
获取最大 / 最小的牌: 借助辅助变量 max 和 min ,遍历统计即可。
----------------
复杂度分析:
时间复杂度 O(N)=O(5)=O(1): 其中 N 为 nums 长度,本题中 N≡5 ;遍历数组使用 O(N) 时间。
空间复杂度 O(N)=O(5)=O(1): 用于判重的辅助 Set 使用 O(N)额外空间。
-----------------classSolution{publicbooleanisStraight(int[] nums){Set<Integer> set =newHashSet<>();int max =0;//创建两变量表示: 五张牌最大值和最小值int min =14;for(int num : nums){//遍历随机的五张牌数组if(num ==0)continue;//跳过大小王 0
max =Math.max(max, num);//最大牌
min =Math.min(min, num);//最小牌if(set.contains(num))returnfalse;//遇到重复直接返回false
set.add(num);//将此牌添加到set集合}return max - min <5;//最大牌-最小牌 < 5 可构成顺子}}