注意
牢记构成顺子的两个条件
●无重复的数字(除0)
●最大值 - 最小值 < 5(除0)
解法:set + 遍历
思想:
同时满足以下两个条件,这5张牌可构成顺子。
- 无重复的牌 (大小王除外)
- 最大牌 - 最小牌 < 5 (大小王除外)
复杂度:
●时间:O(1),五个元素
●空间:O(1),set中五个元素
代码:
class Solution {
public:
bool isStraight(vector<int>& nums) {
if(nums.size() != 5)
return false;
unordered_set<int>set;
//不能用nums[0]作为初始值,因为nums[0]可能为0
int max_val = -1, min_val = 14;
for(int i : nums){
//遇到0直接跳过
if(i == 0)
continue;
max_val = max(i, max_val);
min_val = min(i, min_val);
if(set.find(i) != set.end())
return false;
set.insert(i);
}
return (max_val - min_val) < 5;
}
};
解法2:排序+遍历
思想:
先对数组排序,判断相邻数是否重复。最后判断nums[4] - nums[joker] 是否 < 5
复杂度:
●时间:O(1) = O(5log5) + O(5)
●空间:O(1)
代码:
class Solution {
public:
bool isStraight(vector<int>& nums) {
//因为说了数组取值为[0, 13],所以最小值肯定为0,nums[joker]为第一个非0数
sort(nums.begin(), nums.end());
int count_joker = 0;
for(int i = 0; i < 5; ++i){
if(nums[i] == 0){
count_joker++;
continue;
}
if(i >= 1 && nums[i] == nums[i - 1])
return false;
}
//因为说了数组取值为[0, 13],所以最小值肯定为0,nums[joker]为第一个非0数,即最小值
return nums[4] - nums[count_joker] < 5;
}
};