题目
给定一副牌,每张牌上都写着一个整数。
此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组:
每组都有 X 张牌。
组内所有的牌上都写着相同的整数。
仅当你可选的 X >= 2 时返回 true。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
用一个数组记录所有数字出现的次数,找到所有数出现次数的最大公约数即可。这次主要是记录下公约数的求法,由数论公式(a,b)=(a+or-b,b),()表示两个数的最大公约数得知,a%b和b的最大公约数和a和b的一样。
代码
int count[10000];
int gcd(int a, int b)
{
return a==0?b:gcd(b%a,a);
}
bool hasGroupsSizeX(vector<int>& deck) {
for(auto i:deck)
count[i]++;
int g=-1;
for(auto i:count)
{
if(i)
{
if(~g)
{
g=gcd(g,i);
}
else
{
g=i;
}
}
}
return g>=2;
}