2020.3.28
力扣周末回顾第八题
原题:点击此处
考点:最大公约数,辗转相除法。
题目:在一堆卡牌中,是否能分成很多组都是卡牌数字相同,且数量大于等于2?
题解:
1.遇到这种分成很多组的,且要求每一组的数量都相同的时候,优先考虑最大公约数!!(被坑了好惨,主要还是很少做这类题目)
2.只要想到最大公约数,问题就瞬间简单了。
3.我们要知道这副牌,有多少个不同的数字,每一个数字有多少个。
很明显,用哈希表是最好的。(数组也行,不过我更喜欢用哈希表)
4.求出每一个数字的卡片数量的最大公因数,只要大于等于2,即满足条件。
5.时间复杂度:O(n)遍历两次。
空间复杂度:O(n)创建一个哈希表。
代码:
class Solution {
public boolean hasGroupsSizeX(int[] deck) {
if(deck.length == 1){
return false;
}
Map<Integer,Integer> map = new HashMap<>();
for(int i :deck){
map.put(i,map.getOrDefault(i,0)+1);
}
int g = -1;
for(Map.Entry<Integer,Integer> entry:map.entrySet()){
if(g == -1){
g = entry.getValue();
}else{
g = gcd(g,entry.getValue());
}
}
return g >= 2?true:false;
}
// 辗转相除法求最大公因子
public int gcd(int a,int b){
while(b != 0){
int temp = b;
b = a % b;
a = temp;
}
return a;
}
}