Loading

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

题目

剑指 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)\)
posted @ 2021-11-02 19:16  linzeliang  阅读(54)  评论(0)    收藏  举报