NC63 扑克牌顺子
描述 现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。 有如下规则:
- A为1,J为11,Q为12,K为13,A不能视为14
- 大、小王为 0,0可以看作任意牌
- 如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。 4.数据保证每组5个数字,每组最多含有4个零,数组的数取值为 [0, 13]
要求:空间复杂度 O(1),时间复杂度 O(nlogn),本题也有时间复杂度 O(n) 的解法
思路: 遍历数组,获取数组的最大值mx,最小值mn,0的个数zero, 如果数组有除0之外,相同的值,则返回false,如果没有,则需满足 3 - zero < mx - mn < 5,则返回true,实际上如果mx >= 3-zero,那么一定会出现数组有除0之外的重复值。所以其实只需要判断mx - mn < 5即可
mx,mn,zero不难获取,一次遍历即可,判断是否有重复值,可以用很多办法,因为本题有复杂度 O(n) 的解法,我一直在思考这个问题,我想到的方法感觉都不太行。看评论才懂,果然评论里很多大神。思路不难但是比较巧妙,比如说一个9来了,于是我将第9位的bit置为1,后面如果又来了9,那我去找第9位,第9位的bit如果是1,说明之前已经有9了,说明数组重复。如果后面来的是8,我发现第8位为0,那就将第8位的bit置为1。简单高效占内存小。
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param numbers int整型一维数组
# @return bool布尔型
#
class Solution:
def IsContinuous(self , numbers: List[int]) -> bool:
# write code here
mx = 0
mn = 14
zero = 0
flag = 0
for i in numbers:
if i == 0:
zero += 1
continue
if ((flag >> i) & 1) == 1:
return False
flag |= 1 << i
if i > mx:
mx = i
if i < mn:
mn = i
if zero >= 4:
return True
if ((mx - mn) > 4) | ((mx - mn) < (4 - zero)):
return False
return True