剑指 Offer 61. 扑克牌中的顺子 - 力扣(LeetCode)
大小王也就是0可以视为任何数字
。。。
第202个测试用例傻了,有三个0出现。。。
5张牌是顺子的 充分条件如下:
除大小王之外,其他牌不能重复(可以用哈希表查重)
除大小王之外,最大牌 - 最小牌 <= 4
class Solution {
public:
bool isStraight(vector<int>& nums) {
unordered_set<int> s;
int cnt = 0; //记录0的个数
int min_v = INT_MAX, max_v = -1;//最大值,最小值
for(const auto &num : nums){
if(num == 0){
++cnt;
continue;
}
s.insert(num);
if(num < min_v) min_v = num;
if(num > max_v) max_v = num;
}
if(max_v - min_v > 4) return false;//最大最小值差值不能大于2
if(cnt + s.size() != 5) return false;//0的个数 加上不同的数的数目,如果不等于5,说明有重复数字
return true;
}
};
哈希表的那个地方,可以插入之前就进行查重,有重复就直接返回flase
class Solution {
public:
bool isStraight(vector<int>& nums) {
unordered_set<int> s;
int cnt = 0; //记录0的个数
int min_v = INT_MAX, max_v = -1;//最大值,最小值
for(const auto &num : nums){
if(num == 0){
++cnt;
continue;
}
if(s.count(num)) return false;
s.insert(num);
if(num < min_v) min_v = num;
if(num > max_v) max_v = num;
}
return max_v - min_v <= 4;
}
};