Leetcode 914. 卡牌分组 c语言
问题描述
给定一副牌,每张牌上都写着一个整数。
此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组:
- 每组都有 X 张牌。
- 组内所有的牌上都写着相同的整数。
仅当你可选的 X >= 2 时返回 true。
示例一
输入:[1,2,3,4,4,3,2,1]
输出:true
解释:可行的分组是 [1,1],[2,2],[3,3],[4,4]
示例二
输入:[1,1,1,2,2,2,3,3]
输出:false
解释:没有满足要求的分组。
示例三
输入:[1]
输出:false
解释:没有满足要求的分组。
示例四
输入:[1,1]
输出:true
解释:可行的分组是 [1,1]
示例五
输入:[1,1,2,2,2,2]
输出:true
解释:可行的分组是 [1,1],[2,2],[2,2]
提示
- 1 <= deck.length <= 10000
- 0 <= deck[i] < 10000
简要分析
我们可以构建一个 “数字表” 统计牌上数字出现的个数,然后通过比较它们是否存在大于一的公约数,来判断能否进行分组。
代码如下
//数组count用来统计牌上数字出现个数
//min为出现次数最少的数字出现的次数
bool hasGroupsSizeX(int* deck, int deckSize)
{
int count[10000] = { 0 };
int i = 0, min = 10000;
if(deckSize == 1)
{
return false;
}
for(i = 0 ; i < deckSize; i++)
{
count[deck[i]]++;
}
for(i = 0; i < 10000; i++)
{
if(count[i] == 0)
{
continue;
}
else if(count[i] < min)
{
min = count[i];
}
}
//下面来判断这些出现的次数有没有大于一的公约数
for(int j = 2; j < min + 1; j++)
{
for(i = 0; i < 10000; i++)
{
if(count[i] == 0)
{
continue;
}
else
{
if(count[i] % j == 0)
{
continue;
}
else
{
break;
}
}
}
if(i == 10000)
{
return true;
}
}
return false;
}