给定一副牌,每张牌上都写着一个整数。
此时,你需要选定一个数字 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
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
翻译题意就是:
判断牌组里每张牌出现次数的最大公因数是不是比 2 大。
时间复杂度:O(NlogK),K是最大的出现次数
空间复杂度:O(N)
class Solution(object):
def hasGroupsSizeX(self, deck):
"""
:type deck: List[int]
:rtype: bool
"""
from collections import Counter
l = Counter(deck).values()
def gcd(a, b):
while b:
a, b = b, a % b
return a
res = l[0]
for num in l[1:]:
res = gcd(res, num)
return res >= 2
新学到的知识点:
reduce函数可以实现上一段代码里循环的功能。
class Solution(object):
def hasGroupsSizeX(self, deck):
"""
:type deck: List[int]
:rtype: bool
"""
def gcd(a, b):
while b:
a, b = b, a % b
return a
return functools.reduce(gcd, collections.Counter(deck).values()) >= 2
|