剑指 Offer 61-扑克牌中的顺子C++

题目描述

在这里插入图片描述

解法 排序

class Solution {
    
    
public:
    bool isStraight(vector<int>& nums) {
    
    
        int super = 0;
        sort(nums.begin(), nums.end());
        for(int i = 0; i < nums.size() - 1; i++){
    
    
            if(nums[i] == 0) {
    
    
                super ++;
                continue;
            }
            if(nums[i] == nums[i+1]) return false;
            super -= nums[i + 1] - nums[i] - 1;
            if(super < 0) return false;
        }
        return true;
    }
};

在这里插入图片描述
时间复杂度O(NlogN)
空间复杂度O(1)

解法 集合

大佬的办法,保证两个条件

  1. 除0以外所有的元素都不重复
  2. 元素最大值-元素最小值小于5
    c++的set的插入用insert,且c++不能直接返回set的最大值和最小值
class Solution {
    
    
public:
    bool isStraight(vector<int>& nums) {
    
    
        set<int> s;
        int max = -1;
        int min = 15;
        for(int num : nums) {
    
    
            if(s.find(num) != s.end() && num != 0) return false;
            else {
    
    
                s.insert(num);
                if(num > max) max = num;
                if(num < min && num != 0) min = num;   
            } 
        }
        return max - min < 5 ? true : false;
    }
};

简洁一点可以写这样

class Solution {
    
    
public:
    bool isStraight(vector<int>& nums) {
    
    
        set<int> s;
        int max = -1;
        int min = 15;
        for(int num : nums) {
    
    
            if(num == 0) continue;
            if(s.find(num) != s.end() && num != 0) return false;
            s.insert(num);
            if(num > max) max = num;
            if(num < min) min = num;   
        } 
        return max - min < 5 ? true : false;
    }
};

时间复杂度O(NlogN)
空间复杂度O(N)
java的hashset的add复杂度为O(1),所以总体是O(N)

猜你喜欢

转载自blog.csdn.net/qq_42883222/article/details/112725644