注意第五个例子,1出现2次,2出现4次,也是可行的,因为次数2和4的最大公约数为2,也就是都可以一组有最大公约数(2)个数字。
那就要计算所有元素出现次数的最大公约数是不是大于等于2就可以了。
class Solution {
public:
int gcd(int a, int b){//计算最大公约数
if(b == 0) return a;
return gcd(b, a%b);
}
bool hasGroupsSizeX(vector<int>& deck) {
if(deck.size() < 2) return false;
unordered_map<int, int> m;//<元素值,出现次数>
for(const auto &v : deck) ++m[v];
//初始化为首元素对应的次数,下面第一次计算的话
//自己和自己的最大公约数也就是自己
int x = m.begin()->second;
for(const auto &v : m){
x = gcd(x, v.second);
if(x == 1) return false;//提前终止循环
}
return x >= 2;
}
};
初始化为0也是可以的:
class Solution {
public:
int gcd(int a, int b){//计算最大公约数
if(b == 0) return a;
return gcd(b, a%b);
}
bool hasGroupsSizeX(vector<int>& deck) {
if(deck.size() < 2) return false;
unordered_map<int, int> m;//<元素值,出现次数>
for(const auto &v : deck) ++m[v];
//初始化为首元素对应的次数,下面第一次计算的话
//自己和自己的最大公约数也就是自己
int x = 0;//0和某个数的最大公约数就是该数
for(const auto &v : m){
x = gcd(x, v.second);
if(x == 1) return false;//提前终止循环
}
return x >= 2;
}
};