看完样例,数组长度为大于二的素数肯定不行
接着遍历deck中的每个元素,找出重复元素最少的次数m,然后从2到m,尝试分组
class Solution:
def hasGroupsSizeX(self, deck: List[int]) -> bool:
if len(deck)<2:
return False
if len(deck)==2 and deck[0]==deck[1]:
return True
if self.isPrime(len(deck)):
return False
m=10000
dct=dict()
for num in deck:
dct[num]=dct.get(num,0)+1
for j in dct.values():
if j<m:
m=j
if m<=1:
return False
for x in range(2,m+1):
flag=True
for num in deck:
if dct[num]%x!=0:
flag=False
break
if flag:
return True
return False
def isPrime(self,num):
if num==2:return True
if num%2==0:return False
for i in range(2,int((num)**0.5)+1):
if num%i==0:
return False
return True
题解
题解里面提到的最大公约数,仔细想一下确实是这样,如果deck里面的最大公约数是1,那么肯定存在一对数互质,自然不会存在一个大于1的数n能够同时整除它们,这样肯定分不出等长的牌组
class Solution:
def hasGroupsSizeX(self, deck: List[int]) -> bool:
if len(deck)<2:
return False
if len(deck)==2 and deck[0]==deck[1]:
return True
if self.isPrime(len(deck)):
return False
dct=dict()
for num in deck:
dct[num]=dct.get(num,0)+1
for j in dct.values():
m=j
break
for j in dct.values():
m=gcd(m,j)
if m==1:
return False
return True
def gcd(a,b):
return b if a==0 else gcd(b%a,a)
def isPrime(self,num):
if num==2:return True
if num%2==0:return False
for i in range(2,int((num)**0.5)+1):
if num%i==0:
return False
return True
效率快多了
官方题解直接调库
Counter接受一个可迭代对象,然后生成一个类似dict的Counter对象,也有key和values
使用reduce操作逐个求gcd
class Solution(object):
def hasGroupsSizeX(self, deck):
from fractions import gcd
vals = collections.Counter(deck).values()
return reduce(gcd, vals) >= 2
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/solution/qia-pai-fen-zu-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。