题目链接
题目描述
五张牌,其中大小鬼为癞子,牌面为 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)
