剑指offer Leetcode 61. 扑克牌中的顺子

image-20201221152147727

注意

​ 牢记构成顺子的两个条件

●无重复的数字(除0)

●最大值 - 最小值 < 5(除0)

解法:set + 遍历

思想:

​ 同时满足以下两个条件,这5张牌可构成顺子。

  1. 无重复的牌 (大小王除外)
  2. 最大牌 - 最小牌 < 5 (大小王除外)

复杂度:

●时间:O(1),五个元素

●空间:O(1),set中五个元素

代码:

class Solution {
    
    
public:
    bool isStraight(vector<int>& nums) {
    
    
        if(nums.size() != 5)
            return false;
        unordered_set<int>set;
        //不能用nums[0]作为初始值,因为nums[0]可能为0
        int max_val = -1, min_val = 14;
        for(int i : nums){
    
    
            //遇到0直接跳过
            if(i == 0)
                continue;
            max_val = max(i, max_val);
            min_val = min(i, min_val);
            if(set.find(i) != set.end())
                return false;
            set.insert(i);
        }
        return (max_val - min_val) < 5;
    }
};

解法2:排序+遍历

思想:

​ 先对数组排序,判断相邻数是否重复。最后判断nums[4] - nums[joker] 是否 < 5

复杂度:

●时间:O(1) = O(5log5) + O(5)

●空间:O(1)

代码:

class Solution {
    
    
public:
    bool isStraight(vector<int>& nums) {
    
    
        //因为说了数组取值为[0, 13],所以最小值肯定为0,nums[joker]为第一个非0数
        sort(nums.begin(), nums.end());
        int count_joker = 0;
        for(int i = 0; i < 5; ++i){
    
    
            if(nums[i] == 0){
    
    
                count_joker++;
                continue;
            }
            if(i >= 1 && nums[i] == nums[i - 1])
                return false;
        }   
        //因为说了数组取值为[0, 13],所以最小值肯定为0,nums[joker]为第一个非0数,即最小值
        return nums[4] - nums[count_joker] < 5;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_36459662/article/details/113924922