给定一副牌,每张牌上都写着一个整数。
此时,你需要选定一个数字 X
,使我们可以将整副牌按下述规则分成 1 组或更多组:
- 每组都有
X
张牌。 - 组内所有的牌上都写着相同的整数。
仅当你可选的 X >= 2
时返回 true
。
示例 1:
输入:[1,2,3,4,4,3,2,1]
输出:true
解释:可行的分组是 [1,1],[2,2],[3,3],[4,4]
示例 2:
输入:[1,1,1,2,2,2,3,3]
输出:false
解释:没有满足要求的分组。
示例 3:
输入:[1]
输出:false
解释:没有满足要求的分组。
示例 4:
输入:[1,1]
输出:true
解释:可行的分组是 [1,1]
示例 5:
输入:[1,1,2,2,2,2]
输出:true
解释:可行的分组是 [1,1],[2,2],[2,2]
提示:
1 <= deck.length <= 10000
0 <= deck[i] < 10000
思路:首先记下所有牌的数量nums,取得最小值min,判断min与nums有没有公约数,如果有返回true.
bool gcd(int min, int a)
{
int i;
for(i = 2; i <= min; i++) {
if(a % i == 0 && min % i ==0)
return true;
}
return false;
}
int cmp(void *a,void *b)
{
return *(int *)a - *(int *)b;
}
bool hasGroupsSizeX(int* deck, int deckSize)
{
int i;
int c=1;
int d=0;
int min = 0x7fffffff;
int *num;
if(deckSize<2)
return false;
num = malloc(sizeof(int) * deckSize);
qsort(deck, deckSize, sizeof(int), cmp);
for(i = 0; i < deckSize-1; i++){
if(deck[i] == deck[i+1]) {
c++;
} else {
min = c > min ? min : c;
num[d++] = c;
c=1;
}
}
min = c > min ? min : c;
num[d++] = c;
for(i = 0; i < d; i++) {
if(!gcd(min,num[i])) {
free(num);
return false;
}
}
free(num);
return true;
}