[劍指 offer]--數組/排序--面試題61. 撲克牌中的順子

1 題目描述

從撲克牌中隨機抽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

限制:

數組長度爲 5

數組的數取值爲 [0, 13] .

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/bu-ke-pai-zhong-de-shun-zi-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

2 解題思路

  • 方法:排序➕遍歷
    根據題意,此 5 張牌是順子的 充分條件 如下:

(1)除大小王外,所有牌 無重複 ;
(2)設此 5 張牌中最大的牌爲 max ,最小的牌爲 min (大小王除外),則需滿足:max−min<5

因而,可將問題轉化爲:此 5 張牌是否滿足以上兩個條件?
在這裏插入圖片描述

  • 算法分析
    (1)先對數組執行排序。
    (2)判別重複: 排序數組中的相同元素位置相鄰,因此可通過遍歷數組,判斷 nums[i]=nums[i+1] 是否成立來判重。
    (3)獲取最大 / 最小的牌: 排序後,數組末位元素 nums[4] 爲最大牌;元素 nums[count] 爲最小牌,其中 count 爲大小王的數量。
  • 複雜度分析:

時間複雜度 =O(NlogN)=O(5log5)=O(1) : 其中 N 爲 nums 長度,本題中 N≡5 ;數組排序使用 O(NlogN) 時間。
空間複雜度 O(1) : 變量 joker 使用 O(1) 大小的額外空間。

作者:jyd
鏈接:https://leetcode-cn.com/problems/bu-ke-pai-zhong-de-shun-zi-lcof/solution/mian-shi-ti-61-bu-ke-pai-zhong-de-shun-zi-ji-he-se/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

3 解決代碼

  • 方法:排序➕遍歷《Java代碼》
class Solution {
    public boolean isStraight(int[] nums) {
        //如果重複,肯定錯誤。 如果不存在0,則最大值最小值之差必定爲4 
        //其他情況,最大值最小值之差小於4即可
        int count = 0;
         // 數組排序
        Arrays.sort(nums);
        for(int i = 0; i < 4; i++){
            // 統計大小王數量
            if(nums[i] == 0){
                count++;
            }
            // 若有重複,提前返回 false
            else if(nums[i] == nums[i + 1]){
                return false;
            }
        }
        // 最大牌 - 最小牌 < 5 則可構成順子
        // if(nums[4] - nums[count] < 5){
        //     return true;
        // }
        // return false;
        return nums[4] - nums[count] < 5;

    }
}
  • 方法:排序➕遍歷《python3代碼》
class Solution:
    def isStraight(self, nums: List[int]) -> bool:
        count = 0
        # 數組排序
        nums.sort()
        for i in range(4):
            # 統計大小王數量
            if nums[i] == 0:
                count += 1
            # 若有重複,提前返回 false
            elif nums[i] == nums[i + 1]:
                return False
        # 最大牌 - 最小牌 < 5 則可構成順子
        return nums[4] - nums[count] < 5
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章