题目链接
题目描述
五张牌,其中大小鬼为癞子,牌面为 0。判断这五张牌是否能组成顺子。
解题思路
方法一:set+遍历
我们分两种情况考虑,
一. 如果vector中不包含0的情况:
那么如何判断呢?因为需要是顺子,所以首先不能有重复值, 如果没有重复值,那么形如[1 2 3 4 5]
[5 6 7 8 9]
, 会发现最大值与最小值的差值应该小于5.
二. 如果vector中包含0:
发现除去0后的值,判断方法和1中是一样的。
所以根据如上两个条件,算法过程如下:
- 初始化一个
set
,最大值max = 0, 最小值min = 14 - 遍历数组, 对于大于0的整数,没有在set中出现,则加入到set中,同时更新max, min
- 如果出现在了
set
中,直接返回false
- 数组遍历完,最后再判断一下最大值与最小值的差值是否小于5
class Solution {
public:
bool IsContinuous( vector<int> numbers ) {
if(numbers.size() != 5)
return false;
set<int> st;
int max_=0,min_=14;
for(const int num:numbers){
if(num>0){
if(st.count(num)>0) return false;
st.insert(num);
max_ = max_ < num ? num : max_;
min_ = min_ > num ? num : min_;
}
}
return max_ - min_ < 5;
}
};
- 时间复杂度 O(N)
- 空间复杂度 O(N)
方法二:排序+遍历
```cpp class Solution { public: bool IsContinuous( vectornumbers ) {
} };if(numbers.size() != 5)
return false;
sort(numbers.begin(), numbers.end());
int zero=0;
for(int i=0;i<5;i++){
if(numbers[i]==0){
zero++;
continue;
}
if(i!=4&&numbers[i]==numbers[i+1]) // 没有重复值
return false;
}
return numbers[4] - numbers[zero] < 5; // 连续的5个数最大差值为4,超过后不会连续
class Solution {
public:
bool isStraight(vector
- 时间复杂度 O(NlogN)
- 空间复杂度 O(1)