

这个问题可以用 哈希表 和 最大公约数 (GCD) 来解决。思路如下:
思路解析
-
统计每个数字的频率
-
使用哈希表(
Counter)统计每个数字出现的次数。
-
-
求所有频率的最大公约数 (GCD)
-
只有当这些频率的最大公约数 ≥ 2 时,我们才能满足题目的分组要求。
-
算法步骤
-
统计牌中每个数字出现的次数,存入哈希表
freq_map。 -
计算所有频率的最大公约数
gcd_value。 -
如果
gcd_value >= 2,则返回True,否则返回False。
代码实现
from collections import Counter
from math import gcd
from functools import reduce
def canPartitionDeck(deck):
# 统计每个数字的出现次数
freq_map = Counter(deck)
# 计算所有频率的最大公约数
gcd_value = reduce(gcd, freq_map.values())
# 只有当最大公约数 >= 2 时,才能分组
return gcd_value >= 2
复杂度分析
-
统计频率:O(N)
-
计算 GCD:O(K log M)(K 为不同数字个数,M 为最大频率)
-
总复杂度:接近 O(N)
示例
print(canPartitionDeck([1,2,3,4,4,3,2,1])) # True
print(canPartitionDeck([1,1,1,2,2,2,3,3])) # False
print(canPartitionDeck([1,1,2,2,2,2])) # True
这个方法高效且易于理解!💡
528

被折叠的 条评论
为什么被折叠?



