思路:
因为题目规定了只抽取5张牌,则最大值-最小值不超过5的话就是连续的(除去大小王)
很妙!!!
代码:
set判重
class Solution {
public boolean isStraight(int[] nums) {
Set<Integer> set=new HashSet<>();
int min=14,max=0;
for(int i=0;i<5;i++){
if(nums[i]==0) continue;
if(set.contains(nums[i])){
return false;
}
set.add(nums[i]);
min=Math.min(min,nums[i]);
max=Math.max(max,nums[i]);
}
return max-min<5;
}
}
第二版:
class Solution {
public boolean isStraight(int[] nums) {
int joker=0;
Arrays.sort(nums);
//注意这里是4,防止第二个if判断越界
for(int i=0;i<4;i++){
//统计大小王的数量
if(nums[i]==0){
joker++;
continue;
}
//排除重复的情况
if(nums[i]==nums[i+1]){
return false;
}
}
//nums[joker]表示第一个不是大小王的数字
//nums[4]最大,nums[joker]最小
return nums[4]-nums[joker]<5;
}
}
分解:
1)方法一:
i)定义min为14,定义max为0,因为牌的最大值不超过14
ii)如果为0则跳过,继续循环;并用set判重;最后判断是否max-min<5
2)方法一:
i)这里不用set判重,而是判断nums[i]==nums[i+1]
相等则重复,不等则继续
这里有一个坑是边界问题,所以遍历时,是到4即可
for(int i=0;i<4;i++)
ii)用常量joker来保存大小王的数量,
将数组排序,使得最后一个为最大的数,判断nums[4]-nums[joker]<5即可
因为nums[4]是最大值,nums[joker]表示第一个不是大小王的数字,也就是最小值
复杂度分析:
方法一:
时间复杂度:O(N)遍历N个元素
空间复杂度:O(N) set存储了N个
方法二:
时间复杂度:O(NlogN)排序默认是快排,快排的平均时间复杂度为O(NlogN)
空间复杂度:O(1)使用joker存储大小王数量