题目

剑指 Offer 61. 扑克牌中的顺子

思路1(排序)

  • 先将数组进行排序,排序结束后再遍历:
    • 寻找非0最小值
    • 如果发现非0的数字重复,直接返回false
    • 遍历结束后,如果max-min < 5,则为顺子,否则不是顺子

代码

class Solution {
    public boolean isStraight(int[] nums) {
        Arrays.sort(nums);

        int min = -1;
        int pre = -1;
        for (int n : nums) {
            if (n != 0 && min == -1) {
                min = n;
            }
            if (n != 0 && pre == n) {
                return false;
            }
            pre = n;
        }

        // max - min < 5 为 true 则为顺子
        return nums[nums.length-1] - min < 5;
    }
}

复杂度分析

  • 时间复杂度:\(O(N)\)
  • 空间复杂度:\(O(1)\)

思路2(哈希表)

  • 遍历数组,用哈希表检查是否非0数字重复,计算最大值max和最小值min,最后max-min < 5则是顺子

代码

class Solution {
    public boolean isStraight(int[] nums) {
        HashSet<Integer> set = new HashSet<>();

        int max = -1;
        int min = 14;
        for (int n : nums) {
            if (n == 0) {
                continue;
            }

            // 寻找最大值和最小值
            min = Math.min(min, n);
            max = Math.max(max, n);

            // 判断是否存在重复的非0数字
            if (!set.add(n)) {
                return false;
            }
        }

        return max - min < 5;
    }
}

复杂度分析

  • 时间复杂度:\(O(N)\)
  • 空间复杂度:\(O(N)\)

相关文章:

  • 2022-12-23
  • 2021-08-13
  • 2021-09-12
  • 2022-02-10
  • 2021-10-22
  • 2021-12-30
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-02-16
  • 2022-02-11
  • 2021-12-16
  • 2022-02-12
  • 2022-02-05
  • 2021-07-10
相关资源
相似解决方案