jz061.扑克排中的顺子

 

题目链接

对于这个题,我们首先将数组排序,鉴于当牌中出现对子的时候就不能组成顺子,所以我们用一个集合来判断之前除了大小王之外的牌是不是唯一的。而对于出现大小王的情况,我们用一个joker变量来记录数量,并且同时记录着第一个非0的数字的位置,也是最小的牌的位置。对于是否为顺子的情况,只要满足牌中的最大值与最小值的差值小于5即可。这个算法的时间复杂度是O(NlogN)= O(5log5)= O(1),空间复杂度是O(N)= O(5)= O(1)。

class Solution:
    def isStraight(self, nums: List[int]) -> bool:
        nums.sort()
        repeat = set()
        joker = 0
        for n in nums:
            if n == 0:
                joker += 1
                continue
            if n in repeat:
                return False
            repeat.add(n)
        return nums[-1] - nums[joker] < 5