解题思路:排序 + 遍历
本题给定的描述并不明确,我们抽出的 5 张牌应该是从多副扑克混合后抽取的 5 张牌;所以,可能有多张重复的元素,也有可能出现:[0,0,0,0,0] 这样的情况。
如何判断我们拿到的是“顺子”?
将手中的牌从小到大进行排序
除去大小王外,所有的牌均不重复。
刨去大小王,牌与牌之间的差值和不超过 4 即满足“顺子”的条件。
示例:
[0,0,1,4,5]
对于上述示例,首先,除去大小王,所有的牌不重复;刨去大小王,牌与牌之间的差值和为 (4-1) + (5-4) ≤ 4
所以,我们抽到的这 5 张牌满足“顺子”条件。
代码
class Solution {
public boolean isStraight(int[] nums) {
Arrays.sort(nums);
int i = 0;
while(nums[i] == 0){
i++;
}
int count = 0;
for(; i < nums.length - 1; i++){
if(nums[i] == nums[i + 1]){
return false;
}
count += nums[i + 1] - nums[i];
if(count > 4){
return false;
}
}
return true;
}
}
复杂度分析
- 时间复杂度:O(N * logN)
本解法涉及到对数组排序,所以时间复杂度为 O(N * logN)
- 空间复杂度:O(1)
我们只使用了有限的几个变量,所以额外空间占用 O(1)