给定一副牌,每张牌上都写着一个整数。
此时,你需要选定一个数字 X
,使我们可以将整副牌按下述规则分成 1 组或更多组:
- 每组都有
X
张牌。 - 组内所有的牌上都写着相同的整数。
仅当你可选的 X >= 2
时返回 true
。
示例 1:
输入:[1,2,3,4,4,3,2,1] 输出:true 解释:可行的分组是 [1,1],[2,2],[3,3],[4,4]
示例 2:
输入:[1,1,1,2,2,2,3,3] 输出:false 解释:没有满足要求的分组。
示例 3:
输入:[1] 输出:false 解释:没有满足要求的分组。
示例 4:
输入:[1,1] 输出:true 解释:可行的分组是 [1,1]
示例 5:
输入:[1,1,2,2,2,2] 输出:true 解释:可行的分组是 [1,1],[2,2],[2,2]
提示:
1 <= deck.length <= 10000
0 <= deck[i] < 10000
class Solution:
def hasGroupsSizeX(self, deck: 'List[int]') -> 'bool':
deck = sorted(deck)
num = {}
x, count = 1, 1
# 统计每个元素的个数,放在字典中
for i in range(0, len(deck)-1):
if deck[i] == deck[i+1]:
count += 1
else:
num[deck[i]] = count
count = 1
num[deck[-1]] = count
# 找出个数最小的X,并判断是否>=2
x = min(num.values())
if x < 2:
return False
# 判断每个元素的个数是否都能被 2到x之间 的数整除,即是否可以分组
for i in range(2, x + 1):
for cot in num.values():
if cot % i != 0:
break
else:
return True
return False
def hasGroupsSizeX2(self, deck: 'List[int]') -> 'bool':
d = set(deck)
dic = {}
# 统计每个元素的个数(内置函数),放在字典中
for i in d:
dic[i] = deck.count(i)
# 找出个数最小的X
mn = min(dic.values())
for i in range(2, mn + 1):
for j in dic.values():
if j % i != 0:
break
else:
return True
return False
if __name__=='__main__':
s = Solution()
A = [1,1,1,1,2,2,2,2,2,2]
print(s.hasGroupsSizeX(A))