题目

题解

两个方法。set去重+遍历和排序+遍历
这道题的核心是确定判断顺子的条件,有两个

  1. 数组中没有重复的数
  2. 最大值 - 最小值 < 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;

    }
};