[Lc]面试题61扑克牌中的顺子
Contents
题目
题解
两个方法。set去重+遍历和排序+遍历
这道题的核心是确定判断顺子的条件,有两个
- 数组中没有重复的数
- 最大值 - 最小值 < 5
1. set查重+遍历
- 时间复杂度$O(1)$,因为最多遍历5次
- 空间复杂度$O(1)$
class Solution {//两个方法。1.set查重+遍历
public:
bool isStraight(vector<int>& nums) {
set<int> s;
int max_num = INT_MIN;
int min_num = INT_MAX;
//遍历数组
for(auto &num : nums){
//遇到大小王直接跳过不处理
if(num == 0) continue;
//更新最大最小值
max_num = max(num, max_num);
min_num = min(num, min_num);
//遇到重复的直接返回false
if(s.count(num)) return false;
//将新数插入set去重
s.insert(num);
}
//若没有重复且最大最小值小于5,则说明是顺子
return max_num - min_num < 5;
}
};
2. 排序+遍历
- 时间复杂度$O(1)$,因为最多遍历5次,比方法1稍慢,因为要排序,但是也近似为$O(1)$
- 空间复杂度$O(1)$
class Solution {//两个方法。2. 排序+遍历
public:
bool isStraight(vector<int>& nums) {
sort(nums.begin(), nums.end());//排序
int num_joker = 0;//统计大小王数量
for(int i = 0; i < 4; i++){
//遍历,统计大小王数量,查重
if(nums[i] == 0){
num_joker++;
continue;
}
if(nums[i] == nums[i + 1]) return false;
}
//看最大最小值的差是否满足要求
return nums[4] - nums[num_joker] < 5;
}
};
Author ChrisHRZ
LastMod 2020-07-10