力扣 - 剑指 Offer 61. 扑克牌中的顺子
题目
思路1(排序)
- 先将数组进行排序,排序结束后再遍历:
- 寻找非0最小值
- 如果发现非0的数字重复,直接返回false
- 遍历结束后,如果
max-min < 5,则为顺子,否则不是顺子
代码
class Solution {
public boolean isStraight(int[] nums) {
Arrays.sort(nums);
int min = -1;
int pre = -1;
for (int n : nums) {
if (n != 0 && min == -1) {
min = n;
}
if (n != 0 && pre == n) {
return false;
}
pre = n;
}
// max - min < 5 为 true 则为顺子
return nums[nums.length-1] - min < 5;
}
}
复杂度分析
- 时间复杂度:\(O(N)\)
- 空间复杂度:\(O(1)\)
思路2(哈希表)
- 遍历数组,用哈希表检查是否非0数字重复,计算最大值
max和最小值min,最后max-min < 5则是顺子
代码
class Solution {
public boolean isStraight(int[] nums) {
HashSet<Integer> set = new HashSet<>();
int max = -1;
int min = 14;
for (int n : nums) {
if (n == 0) {
continue;
}
// 寻找最大值和最小值
min = Math.min(min, n);
max = Math.max(max, n);
// 判断是否存在重复的非0数字
if (!set.add(n)) {
return false;
}
}
return max - min < 5;
}
}
复杂度分析
- 时间复杂度:\(O(N)\)
- 空间复杂度:\(O(N)\)
我走得很慢,但我从不后退!

浙公网安备 33010602011771号