扑克牌顺子
C++,两种方法。
- 排序后判断王的数量能不能补齐顺子的空缺;
- 不排序,最大值与最小值的差是否小于4。
以上两种都要注意的几个点:
- 除了0以外,出现任何重复的数字都说明不能出现顺子;
- 空序列;
第二种陪了女朋友再更新。
更新第二种方法:
class Solution {
public:
bool IsContinuous(vector<int> numbers) {
vector<int> dict(14, 0);
if (numbers.empty()) return false;
int min_num = 14, max_num = 0;
for (int i = 0; i < numbers.size(); i++) {
if (numbers[i] == 0) {
continue;
}
dict[numbers[i]]++;
if (dict[numbers[i]] > 1) return false;
min_num = min(min_num, numbers[i]);
max_num = max(max_num, numbers[i]);
}
if (max_num - 4 <= min_num) return true;
else return false;
}
};
第一种排序的很简单,代码直接贴了。
class Solution {
public:
bool IsContinuous(vector<int> numbers) {
if (numbers.empty()) return false;
sort(numbers.begin(), numbers.end());
int i = 0;
while (i < numbers.size() && numbers[i] == 0) i++;
if (i == numbers.size()) return true;
int cnt = i;
for (; i < numbers.size() - 1; i++) {
if (numbers[i+1] - numbers[i] > 1)
cnt -= (numbers[i+1] - numbers[i] - 1);
else if (numbers[i+1] - numbers[i] == 0)
return false;
if (cnt < 0)
return false;
}
return true;
}
};