leetcode914. 卡牌分组

举报
兔老大 发表于 2021/04/22 23:36:17 2021/04/22
【摘要】 给定一副牌,每张牌上都写着一个整数。 此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组: 每组都有 X 张牌。 组内所有的牌上都写着相同的整数。 仅当你可选的 X >= 2 时返回 true。   示例 1: 输入:[1,2,3,4,4,3,2,1] 输出:true 解释:可行的分组是 [1...

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

此时,你需要选定一个数字 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

思路:思考后得出结论,每个数字出现的次数,如果有一个总的最大公约数,就可行。

比如1出现了2次,2出现了4次,3出现了8次,此用例就是true。

另外注意到deck[i]的范围,明显用桶记录更好。


  
  1. class Solution {
  2. public boolean hasGroupsSizeX(int[] deck) {
  3. int[] count = new int[10000];
  4. for (int c: deck) count[c]++;
  5. int g = -1;
  6. for (int i = 0; i < 10000; ++i)
  7. if (count[i] > 0) {
  8. if (g == -1) g = count[i];
  9. else g = gcd(g, count[i]);
  10. }
  11. return g >= 2;
  12. }
  13. public int gcd(int x, int y) {
  14. return x == 0 ? y : gcd(y%x, x);
  15. }
  16. }

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/105977094

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。