1、模拟
我们可以首先将数组进行排序。而后我们统计数组中出现0的个数,而后我们将每个元素与其之前的元素进行比较:1、若两个元素相等,说明不可能为顺子,直接返回false;2、若两个元素不相等,我们用0的个数减去两个元素之差-1表示可能需要多少个大小王,若此时大小王的个数小于0说明个数不够无法组成顺子,直接返回false。
class Solution {
public:
bool isStraight(vector<int> &nums) {
int jokers = 0, last = -1;
sort(nums.begin(), nums.end());
for (int i = 0; i < 5; ++i) {
if (nums[i] == 0) ++jokers;
else {
if (last != -1) {
if (nums[i] == last) return false;
jokers -= nums[i] - last - 1;
if (jokers < 0) return false;
}
last = nums[i];
}
}
return true;
}
};
2、哈希集合+最大最小值
根据题意我们可以发现,实际上一个合法的顺子需要满足以下两个条件:1、数组中非0的最大值与最小值之差小于5;2、非0元素中不存在重复的数字。因此我们可以使用哈希集合来筛选重复的数字,最终只需要判断数组中最大值与最小值之差是否小于5即可。
class Solution {
public:
bool isStraight(vector<int> &nums) {
unordered_set<int> hs;
int temp_max = INT_MIN, temp_min = INT_MAX, index = 0;
for (int i: nums) {
if (!i) continue;
if (hs.count(i)) return false;
hs.insert(i);
temp_min = min(temp_min, i);
temp_max = max(temp_max, i);
}
return temp_max - temp_min < 5;
}
};