leetcode 914. 卡牌分组

leetcode 914. 卡牌分组.


题目描述

  1. 卡牌分组

给定一副牌,每张牌上都写着一个整数。

此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组:

每组都有 X 张牌。 组内所有的牌上都写着相同的整数。 仅当你可选的 X >= 2 时返回 true。

示例 1:

输入:deck = [1,2,3,4,4,3,2,1] 输出:true 解释:可行的分组是 [1,1],[2,2],[3,3],[4,4] 示例 2:

输入:deck = [1,1,1,2,2,2,3,3] 输出:false 解释:没有满足要求的分组。

提示:

1 <= deck.length <= 104 0 <= deck[i] < 104

解题思路

法1

最大公约数:\

  1. 记录每个卡牌出现的 次数

  2. 求卡牌次数的最大公约数,如果最大公约数大于2,则说明可以分组,否则不能分组

输出结果

  • 时间复杂度(O(n))
  • 空间复杂度(O(n))

执行结果

法1

创建一个空的整数映射 countMap,用于记录每个数字在牌中出现的次数。

遍历整个 deck 数组,统计每个数字出现的次数,并将其保存到 countMap 中。

初始化一个变量 g,将其赋值为 countMap[deck[0]],作为最大公约数的初始值。

遍历 countMap 中的所有值,将每个值与变量 g 计算最大公约数,并将结果赋值给 g。

如果 g 的值大于等于 2,则返回 true,否则返回 false。

func hasGroupsSizeX(deck []int) bool {
 countMap := make(map[int]int)

 for _, num := range deck {
  countMap[num]++
 }

 g := countMap[deck[0]]

 for _, count := range countMap {
  g = gcd(g, count)
 }

 return g >= 2
}

func gcd(a, b int) int {
 if b == 0 {
  return a
 }
 return gcd(b, a%b)
}

执行结果: 通过 显示详情 查看示例代码 添加备注

执行用时: 12 ms , 在所有 Go 提交中击败了 77.19% 的用户 内存消耗: 5.4 MB , 在所有 Go 提交中击败了 71.93% 的用户 通过测试用例: 74 / 74 炫耀一下:

法2

法3

本文由 mdnice 多平台发布

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值