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