题目来源:
leetcode题目,网址:914. 卡牌分组 - 力扣(LeetCode)
解题思路:
遍历数组,记录所有出现元素的出现次数,寻找其最大公因数,若最大公因数大于1,则返回true,否则返回false。
解题代码:
class Solution {
public boolean hasGroupsSizeX(int[] deck) {
Map<Integer,Integer> map=new HashMap<>();
for(int num:deck){
map.put(num,map.getOrDefault(num,0)+1);
}
boolean res=true;
int gcd=map.get(deck[0]);//最大公因数
for(Map.Entry<Integer,Integer> entry:map.entrySet()){
gcd=forGCD(entry.getValue(),gcd);
if(gcd==1){
res=false;
break;
}
}
return res;
}
public int forGCD(int num1,int num2){
int res=Math.min(num1,num2);
for(int i=res;i>=1;i--){
if(num1%i==0 && num2%i==0){
res=i;
break;
}
}
return res;
}
}
总结:
官方题解给出了暴力枚举所有可能及求最大公约数两种解法,但他求最大公约数用的是辗转相除法,代码较为简洁,时间复杂度和空间复杂度较低,要记住。
//求最大公约数
public int gcd(int x,int y){
return x==0?y:gcd(y%x,x);
}