【数学知识】剑指 Offer 61. 扑克牌中的顺子

本问题对应课程链接:剑指offer刷题第四期

要求:

1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。
2、给出你代码所用的时间复杂度和空间复杂度

共以下 16 个回答

  • hi 普通 2023年8月22日 下午3:47
    1. 排序->有0删0->看是否有重复数字,有的话一定不能成为顺子->看最大值和最小值差为多少,顺子中数的差值不能超过4
    class Solution {
    public:
        bool isStraight(vector<int>& nums) {
            sort(nums.begin(), nums.end());
            int k = 0;
            while(!nums[k]) k++;
            for(int i = k + 1; i < 5; i++)
                if(nums[i] == nums[i - 1]) return false;
    
            return nums.back() - nums[k] <= 4;
        }
    };
    
    0 赞同 0 条回复
  •  普通 2023年8月8日 下午11:08

    c++ 代码 排查
    class Solution {
    public:
    bool isStraight(vector& nums)
    { bool c=false;
    int vv=0;
    sort(nums.begin(),nums.end());
    for(int i=0;i<nums.size()-1;i++)
    {
    if(nums[i]0)
    vv++;
    }
    for(int i=0;i<nums.size()-1;i++)
    {
    if(nums[i]!=0)
    {
    if(nums[i+1]-nums[i]
    1)
    c=true;
    else
    {
    if(nums[i+1]-nums[i]0)
    {
    c=false;
    break;
    }
    if(nums[i+1]-nums[i]<=vv+1)
    c=true,vv=0;
    else
    {
    c=false;
    break;
    }

            }
         }
    
        }
           return c;
    }
    

    };

    0 赞同 0 条回复
  • 土豆芋泥包_ 普通 2023年8月6日 下午8:26

    插入代码

    class Solution {
        public boolean isStraight(int[] nums) {
            Set<Integer> set = new HashSet<>();
            int max=-1,min=14;
            for(int i=0;i<nums.length;i++){
                if(nums[i]==0) continue;
                if(set.contains(nums[i])) return false;
                set.add(nums[i]);
                max = Math.max(nums[i],max);
                min = Math.min(nums[i],min);
            }
            return max-min<5;
        }
    }
    
    0 赞同 0 条回复
  • 艺 普通 2023年8月5日 下午5:00

    “`c++
    //时间复杂度:O(n)
    //空间复杂度:O(n)
    class Solution {
    public:
    bool isStraight(vector& nums) {
    set
    s;
    int Max = -1, Min = 20;

        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] == 0) {
                continue;
            }
            if (s.count(nums[i])) {
                return false;
            }
            s.insert(nums[i]);
            Max = max(Max, nums[i]);
            Min = min(Min, nums[i]);
        }
    
        return Max - Min < 5;
    }
    

    };

    0 赞同 0 条回复
  • 北辰 普通 2023年8月4日 下午5:10
    class Solution {
        public boolean isStraight(int[] nums) {
           Set<Integer> set = new HashSet<>();
            int max=-1,min=20;
            for(int i=0;i<nums.length;i++) {
                if(nums[i]==0) continue;
                if(set.contains(nums[i])) return false;
                set.add(nums[i]);
                max = Math.max(nums[i], max);
                min = Math.min(nums[i], min);
            }
            return max-min<5;
        }
    }
    

    思路:set.contains()方法直接可判断有没有这个元素,这个没想到

    0 赞同 0 条回复
  • #00456B 普通 2023年8月2日 下午11:45
    class Solution {
    public:
        bool isStraight(vector<int>& nums) {
            //用这5个数字的最大最小值之差是不是<=4来判断
            //用一个unordered_set来记录存在的数字
            //如果遇到0则跳过
            unordered_set<int> uset;
            int minVal = INT_MAX, maxVal = INT_MIN;
            for(int x:nums){
                if(x == 0){
                    continue;
                }
                else{
                    if(uset.count(x)){//出现重复
                        return false;
                    }
                    uset.insert(x);
                    minVal = min(x, minVal);
                    maxVal = max(x, maxVal);
                }
            }
            return maxVal - minVal <= 4;
        }
    };
    
    0 赞同 0 条回复
  • Mby 普通 2023年8月2日 下午8:27
    class Solution {
        public boolean isStraight(int[] nums) {
            //排序法
    
            //成立条件
            //1.不存在重复的数,大小王除外
            //2.最大值 - 最小值 < 5,大小王除外
            Set<Integer> set = new HashSet<>();
            int max = -1, min = 20;
            for(int i = 0; i <nums.length; i++){
                if(nums[i] == 0)continue;
                if(set.contains(nums[i]))return false;
                set.add(nums[i]);
                max = Math.max(nums[i], max);
                min = Math.min(nums[i], min);
            }
            return max - min < 5;
            //时间复杂度:O(n)
            //空间复杂度:O(n)
        }
    }
    
    
    0 赞同 0 条回复
  • CKX 普通 2023年8月2日 下午6:13
    func isStraight(nums []int) bool {
        numSet := make(map[int]bool)
        max, min := math.MinInt32, math.MaxInt32
        for _, num := range nums {
            if num == 0 {
                //大小王直接跳过
                continue
            }
            if numSet[num] {
                //重复数字
                return false
            }
            numSet[num] = true
            if num > max {
                max = num
            }
            if num < min {
                min = num
            }
        }
    
        return max - min < 5
    
    }
    
    • 时间O(n)
    • 空间O(n)
    0 赞同 0 条回复
  • Marshan 普通 2023年8月2日 下午3:50

    找规律

    class Solution {
    public:
        bool isStraight(vector<int>& nums) {
            unordered_set<int> repeat;
            int Max = 0,Min = 14;
            for(int num:nums){
                if(num == 0){
                    continue;
                }
                Max = max(Max,num);
                Min = min(Min,num);
                if(repeat.find(num) != repeat.end()){
                    return false;
                }
                repeat.insert(num);
            }
            return (Max - Min < 5);
        }
    };
    
    0 赞同 0 条回复
  • NullPointerException 普通 2023年7月31日 下午6:55

    class Solution {
    public boolean isStraight(int[] nums) {
    //分析 当给定数组最小min max
    //非大小王重复 那就不是顺子
    // 非重复 max -min <5 一定为顺子
    // max-min>=5 不是
    int min =20;
    int max =0;
    Set set =new HashSet();
    for(int i=0;i<nums.length;i++)
    {
    if(nums[i]0)
    {

            }else
            {
                if(set.contains(nums[i]))
                {
                    return false;
                }else{
                    set.add(nums[i]);
                  max=  Math.max(max,nums[i]);//4 7  9 
                 min=   Math.min(min,nums[i]);//4  2
                }
            }
        }
        return max-min<5;
    }
    

    }

    0 赞同 0 条回复
  • mpweixin用户 普通 2023年7月31日 上午9:56
    class Solution {
        public boolean isStraight(int[] nums) {
            // 快排一趟
            quickSort(nums, 0, nums.length - 1);
            int[] index = new int[nums.length];
            int min = Integer.MAX_VALUE;
            int count0 = 0;
            for (int i = 0; i < nums.length; i++) {
                if (nums[i] == 0) count0++;
                if (nums[i]<min && nums[i]!=0) {
                    min = nums[i];
                }
            }
            // 把正确的位置上的数字放到正确的位置上然后比0的个人 如果任意值-最小值>=5说明无法成顺子
            for (int i = 0; i < nums.length; i++) {
                if (nums[i] != 0) {
                    if (nums[i]-min>=nums.length) return false;
                    else index[nums[i]-min] = nums[i];
                }
            }
            int index0 = 0;
            for (int i = 0; i < index.length; i++) {
                if (index[i] == 0) {
                    index0++;
                }
            }
            if (index0 == count0) return true;
            else return false;
        }
    
        private void quickSort(int[] nums, int left, int right) {
            if (left>right) return;
            int i=left, j=right;
            int jizhun = nums[left];
            while (i < j) {
                while (nums[j] >= jizhun && j>i) j--;
                while (nums[i] <= jizhun && i<j) i++;
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
            }
            nums[left] = nums[i];
            nums[i] = jizhun;
    
            quickSort(nums, left, i-1);
            quickSort(nums, i+1, right);
        }
    }
    
    0 赞同 0 条回复
  • 人生何处不青山 普通 2023年7月30日 下午8:45

    最大最小值相减

    function isStraight(nums: number[]): boolean {
        let max = 0,min = 14;
        let set = new Set<number>();
        for(let i of nums) {
            if(i == 0) continue;
            max = Math.max(max,i);
            min = Math.min(min,i);
            if(set.has(i)) return false;
            set.add(i);
        }
        return max - min < 5;
    };
    
    0 赞同 0 条回复
  • Luminous 普通 2023年7月30日 上午11:09

    以下是代码

    class Solution {
        public boolean isStraight(int[] nums) {
            int MAX=0,MIN=14;
            Set<Integer> set=new HashSet<>();
            for(int num:nums){
                if(num==0) continue;
                MAX=Math.max(num,MAX);
                MIN=Math.min(num,MIN);
                if(set.contains(num)) return false;
                set.add(num);
            }
            return MAX-MIN<5;
        }
    }
    
    0 赞同 0 条回复
  • 阿尚 普通 2023年7月29日 下午11:53
    class Solution {
        public boolean isStraight(int[] nums) {
            int maxVal = 0;
            int minVal = 13;
            Set<Integer> set = new HashSet<>();
            for(int i = 0; i < nums.length; i++){
                if(nums[i] == 0){
                    continue;
                }
                if(!set.isEmpty() && set.contains(nums[i])) return false;//0除外的数字重复直接返回false;
                set.add(nums[i]);
                if(nums[i] > maxVal) maxVal = nums[i];
                if(nums[i] < minVal) minVal = nums[i];
            }
    
            return maxVal - minVal < 5;
        }
    }
    
    0 赞同 0 条回复
  • 长河呼叫黄江 普通 2023年7月29日 下午7:17

    7.29
    Day20:下面是代码

    //排序+遍历
    class Solution {
        public boolean isStraight(int[] nums) {
            int joker = 0;
            Arrays.sort(nums);
            //注意是0-3,如果i=4,则存在数组越界异常。
            for(int i = 0; i < 4; i++){
                if(nums[i] == 0) joker++;
                else if(nums[i] == nums[i+1]) return false;
            }
            return nums[4] - nums[joker] < 5;
        }
    }
    
    //集合+遍历
    class Solution {
        public boolean isStraight(int[] nums) {
            HashSet<Integer> set = new HashSet<>();
            int max = 0, min = 13;
            for(int num : nums){
                if(num == 0) continue;
                max = Math.max(num, max);
                min = Math.min(num, min);
                if(set.contains(num)) return false;
                set.add(num);
            }
            return max - min < 5;
        }
    }
    
    
    
    0 赞同 0 条回复
  • AD钙奶 普通 2023年7月29日 下午5:23
    class Solution {
        public boolean isStraight(int[] nums) {
            Arrays.sort(nums);
            // 统计数与数之间的间隔,5个数且是顺子的间隔最大为4
            int cnt = 0;
            for(int i = 1; i < nums.length; i ++) {
                if(nums[i - 1] == 0) continue;
                if(nums[i] == nums[i - 1]) return false;
                cnt += nums[i] - nums[i - 1];
            }
            return cnt < 5;
        }
    }
    
    0 赞同 0 条回复

# 回答此问题

后才能回答