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

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

要求:

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

共以下 8 个回答

  • sc_Yang 普通 2023年9月11日 上午8:34
    // 核心思想:顺子的话,除0之外,排序后前后各位置差距应该是1,然后大小王可以当任何数
    class Solution {
    public:
        bool isStraight(vector<int>& nums) {
            int joker=0;
            sort(nums.begin(), nums.end());
            for(int i=0;i<nums.size()-1;i++){
                if(nums[i]==0){
                    joker++;
                }else if(nums[i]>=nums[i+1]){ // 有重复则返回false
                    return false;
                }
            }
            // 返回最大值减去最小值(除0之外)差距小于5,即可构成顺子
            return nums[4]-nums[joker] < 5;
        }
    };
    
    0 赞同 0 条回复
  • 小肸 永久会员 2023年9月7日 下午9:53
    class Solution {
        //时间复杂度和空间复杂度都为O(N)
        public boolean isStraight(int[] nums) {
            Set<Integer> set = new HashSet<>();
            int min = 14, max = 0;
            for (int i : nums) {
                if (i == 0) {
                    continue;
                } else {
                    if (set.contains(i)) {
                        return false;
                    }
                    set.add(i);
                    min = Math.min(min, i);
                    max = Math.max(max, i);
                }
            }
            return max - min < 5;
        }
    }
    
    0 赞同 0 条回复
  • sincere 普通 2023年9月7日 下午2:08
    • 思路:非大小王数字不能重复、除大小王外其他数字最大差值不超过5
    • 复杂度:时间复杂度O(logn)、空间复杂度O(1)
    class Solution {
        public boolean isStraight(int[] nums) {
            Arrays.sort(nums);
            int z = 0;
            for (int i = 0; i < nums.length-1; i++) {
                if (nums[i] == 0) {
                    z++;// 统计大小王
                } else if (nums[i] == nums[i + 1]) {
                    return false;// 非大小王数字不能重复
                }
            }
            return nums[4] - nums[z] < 5;// 除大小王外其他数字最大差值不超过5
        }
    }
    
    0 赞同 0 条回复
  • 别扒拉我 普通 2023年9月4日 下午11:22

    先排序,然后计算有几个king

    class Solution {
        public boolean isStraight(int[] nums) {
            if(nums.length > 5){
                return false;
            }
            quicksort(nums, 0, nums.length-1);
            int king=0, min, max;
            for(int i=0; i<4; i++){
                if(nums[i] == 0){
                    king++;
                }else if(nums[i] == nums[i+1]){
                    return false;
                }
            }
            max = nums[4];
            min = nums[king];
            return max - min < 5;
        }
    
        public void quicksort(int[] arr, int start, int end) {
            if(start < end){
                int pivot = arr[start];
                int low = start, high = end;
                while(low < high){
                    while(low < high && arr[high] >= pivot){
                        high--;
                    }
                    arr[low] = arr[high];
                    while(low < high && arr[low] < pivot){
                        low++;
                    }
                    arr[high] = arr[low];
                }
                arr[low] = pivot;
                quicksort(arr, start, low);
                quicksort(arr, low+1, end);
            }
        }
    }
    
    0 赞同 0 条回复
  • c 普通 2023年9月3日 下午9:38

    排序遍历

    class Solution {
        public boolean isStraight(int[] nums) {
            Arrays.sort(nums);
            int zero = 0;
            for(int i = 0;i<4;i++){
                if(nums[i]==0){
                    zero++;
                    continue;
                }
                if(nums[i]==nums[i+1]){
                    return false;
                }
            }
            return nums[4]-nums[zero]<5;
        }
    }
    
    0 赞同 0 条回复
  • 塔底的仰望 永久会员 2023年9月3日 下午3:50

    暴力排序法

    class Solution {
        public boolean isStraight(int[] nums) {
            //暴力法,先排序
            for (int i = 1; i < nums.length; i++) {
                int j = i;
                for (; j > 0; j--) {
                    if (nums[j-1] < nums[i]) {
                        break;
                    }
                }
                int temp = nums[i];
                for(int k = i; k > j; k--) {
                    nums[k] = nums[k - 1];
                }
                nums[j] = temp;
            }
    
            int sum = 5;
            int skip = 0;
            int i = 0;
            while (nums[i] == 0) {
                skip++;
                i++;
            }
            i++;
            while (i < nums.length) {
                if (nums[i] - nums[i-1] == 0) {
                    return false;
                } else {
                    skip -= nums[i] - nums[i-1] - 1;
                }
                i++;
            }
            return skip >= 0;
        }
    }
    
    0 赞同 0 条回复
  • 行动派小彩笔 普通 2023年9月3日 下午3:24
    /*
    1. 除了大小王以为不能用重复的
    2. 最大值和最小值不超过5
    */
    class Solution {
    public:
        bool isStraight(vector<int>& nums) {
            set<int> s;
            int Max=0;int Min = 14;
            for(int i=0;i<nums.size();++i)
            {
                if(nums[i]==0) continue;
                Min = min(nums[i],Min);
                Max = max(nums[i],Max);
                if(s.count(nums[i])) return false;
                s.insert(nums[i]);
            }
            return Max-Min<5;
        }
    };
    
    0 赞同 0 条回复
  • JustRtn 普通 2023年9月3日 下午3:05

    先排序,然后看是否满足下面条件:
    1. 除0外元素不重复;
    2. 除0外元素最大最小值差小于5;

    class Solution {
    public:
        bool isStraight(vector<int>& nums) {
            sort(nums.begin(), nums.end());
            int z = 0;
            for (int i = 0; i < nums.size() - 1; i++) {
                if (nums[i] == 0) {
                    z++;
                } else if (nums[i] == nums[i + 1]){
                    return false;
                }
            }
            return nums[4] - nums[z] < 5;
        }
    };
    
    0 赞同 0 条回复

# 回答此问题

后才能回答