「ソードフィンガーオファー」ブラシ質問シリーズ-(63)ポーカーインストレート

トピック

トランプからランダムに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

アイデア

大小の王は任意の数と見なすことができるため、最初に0と見なします。
5つの数値が連続しているかどうかを判断する最も直感的な方法は、配列をソートすることです。0は任意の数にすることができるため、0を使用して配列のギャップを埋めることができます。ソートされた配列が連続的でない場合、ギャップを埋めるのに十分な0がある限り、数値は実際には連続的です。
3つのこと:
1.
配列内の0の数を数える2.並べ替え後、配列内の隣接する数の間の空席の数を数える
3.空席の総数が0の数以下の場合、配列は連続的です。そうでなければ、それは連続的ではありません。

注:ゼロ以外の数値が繰り返し現れる場合、配列は連続的ではありません。

コード

class Solution:
    def isStraight(self, nums: List[int]) -> bool:
        nums.sort()
        zero_count,gap_count=0,0
    
        for num in nums:
            if num==0: zero_count+=1
            else: break

        small = zero_count
        big = small+1

        while small<big and big<len(nums):
            if nums[small]==nums[big]: return False
            gap_count = nums[big]-nums[small]-1
            small = big
            big+=1
            if gap_count>zero_count:return False
        return True

複雑さ

時間の複雑さO(nlogn):ここで、Nはnumsの長さであり、配列のソートはO(nlogn)時間を使用します。
スペースの複雑さO(1)

おすすめ

転載: blog.csdn.net/weixin_44776894/article/details/107514530