python-leetcode-914. 卡牌分组

914. 卡牌分组 - 力扣(LeetCode)

这个问题可以用 哈希表最大公约数 (GCD) 来解决。思路如下:

思路解析

  1. 统计每个数字的频率

    • 使用哈希表(Counter)统计每个数字出现的次数。

  2. 求所有频率的最大公约数 (GCD)

    • 只有当这些频率的最大公约数 ≥ 2 时,我们才能满足题目的分组要求。

算法步骤

  1. 统计牌中每个数字出现的次数,存入哈希表 freq_map

  2. 计算所有频率的最大公约数 gcd_value

  3. 如果 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

这个方法高效且易于理解!💡

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值