题目
从若干副扑克牌中随机抽 张牌,判断是不是一个顺子,即这
张牌是不是连续的。
为数字本身,
为
,
为
,
为
,
为
,而大、小王为
,可以看成任意数字。
不能视为
。
示例 1:
输入: [1,2,3,4,5] 输出: True
示例 2:
输入: [0,0,1,2,5] 输出: True
解题思路:集合 Set + 遍历
根据题意,此 张牌是顺子的 充分条件 如下:
- 除大小王外,所有牌 无重复 ;
- 设此
张牌中最大的牌为
,最小的牌为
(大小王除外),则需满足:
复杂度分析
时间复杂度:,其中
指的是字符串
的长度,本题中
;遍历数组使用
时间。
空间复杂度:, 用于判重的辅助 Set 使用
额外空间。
我的代码
class Solution {
public boolean isStraight(int[] nums) {
Set<Integer> repeat = 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(repeat.contains(num)) return false; // 若有重复,提前返回 false
repeat.add(num); // 添加此牌至 Set
}
return max - min < 5; // 最大牌 - 最小牌 < 5 则可构成顺子
}
}