卡牌分组
给定一副牌,每张牌上都写着一个整数。
此时,你需要选定一个数字 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
解释:没有满足要求的分组。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/x-of-a-kind-in-a-deck-of-cards
题解一:
笔者的题解是使用HashMap集合来存储每张牌和其出现的次数,然后找出出现次数最少的那张牌,若其出现次数min小于2,则返回false,否则从2开始循环到min,每张牌的出现次数对其取余,若每张牌的出现次数对该数取余都等于0,则返回true,若从2开始循环到min,不存在一个数使得每张牌的出现次数对其取余都等于0,则返回false。代码如下:
class Solution {
public boolean hasGroupsSizeX(int[] deck) {
Map<Integer,Integer> map=new HashMap<Integer,Integer>();
for(int i:deck){
map.put(i,map.getOrDefault(i,0)+1);//存储每张牌及其出现次数
}
int min=Integer.MAX_VALUE;
Set<Integer> col=map.keySet();
for(int i:col) {
min=Math.min(min,map.get(i));//最小的出现次数
}
if(min<2){
return false;
}
for(int i=2;i<=min;i++){
boolean flag=true;
for(int c:col){
if(map.get(c)%i!=0){
flag=false;
break;
}
}
if(flag){
return flag;
}
}
return false;
}
}
题解二:
官解的解法是求最大公约数,求出每张牌的出现次数,然后求这些出现次数的最大公约数,若该最大公约数小于2,返回false,否则返回true。代码如下:
class Solution {
public boolean hasGroupsSizeX(int[] deck) {
int[] count = new int[10000];
for (int c: deck) {
count[c]++;
}
int g = -1;
for (int i = 0; i < 10000; ++i) {
if (count[i] > 0) {
if (g == -1) {
g = count[i];
} else {
g = gcd(g, count[i]);
}
}
}
return g >= 2;
}
public int gcd(int x, int y) {//求最大公约数的函数
return x == 0 ? y : gcd(y % x, x);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153916.html