songyy5517 / DataStructures-Algorithms

0 stars 0 forks source link

剑指 Offer 61: 扑克牌中的顺子 #68

Open songyy5517 opened 1 year ago

songyy5517 commented 1 year ago

从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。

示例 1:

输入: [1,2,3,4,5]
输出: True

示例 2:

输入: [0,0,1,2,5]
输出: True

分析 这道题的关键在于找出能成为顺子的条件。顺子的条件有两个:没有对子&数字连续。

songyy5517 commented 1 year ago

思路:排序 & 遍历 顺子的充要条件:无重复 & 除大小王外的最大牌值差小于5。

  1. 异常处理;
  2. 排序;
  3. 遍历数组: (1)记录0的个数; (2)判断是否有对子;
  4. 计算除大小王外的最大牌值差,若小于5则返回true,否则返回false。

复杂度分析

songyy5517 commented 1 year ago
class Solution {
    public boolean isStraight(int[] nums) {
        // 思路:排序 & 遍历
        // 顺子的充要条件:无重复 & 除大小王外的最大最小牌只差小于5
        // 1. 异常处理
        if (nums == null || nums.length != 5)
            return false;

        // 3. 将数组升序排序
        Arrays.sort(nums);    // 快速排序 O(NlogN)

        // 3. 遍历
        int count_zero = 0;
        for (int i = 0; i < nums.length - 1; i++){
            if (nums[i] == 0){
                count_zero ++;
                continue;
            }

            if (nums[i+1] == nums[i])
                return false;
        }

        return nums[4] - nums[count_zero] < 5;
    }
}
songyy5517 commented 1 year ago

2023/11/25

  1. 顺子的充要条件
  2. Arrays.sort的复杂度

2024/3/9