LeetCode 914. 卡牌分组
914. 卡牌分组
难度简单
给定一副牌,每张牌上都写着一个整数。
此时,你需要选定一个数字 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
思路:这道题可以先将提供的所有相同数据用数组存储起来,然后找出这些数据个数的最大公约数用另一个数组储存起来,在这个数组中,找出最小的数字,用所有数据个数依次除以这个最小的最大公约数,如果余数不为0,证明不成立,返回false,否则,返回true,然后重点来了,一定要记得考虑好边界值,鄙人因为这个问题找了一个小时还有多的bug,费话不多说,咱来看看代码。
bool hasGroupsSizeX(int* deck, int deckSize){ if(deckSize<2){ return false; } int a[10000],b[deckSize-1]; int i,m,n,c,min,flag=1; for(i=0;i<10000;i++){ a[i]=0; } for(i=0;i<deckSize;i++){ a[deck[i]]++; } for(i=0;i<deckSize-1;i++){ n=1; m=a[deck[i]]; c=a[deck[i+1]]; while(n!=0){ n=m%c; m=c; c=n; } b[i]=m; } min=b[0]; for(i=0;i<deckSize-1;i++){ min=min>b[i]?b[i]:min; } for(i=0;i<deckSize;i++){ if(a[deck[i]] % min != 0){ flag=0; } } for(i=0;i<deckSize-1;i++){ if(b[i]==1){ return false; } } if(flag==0){ return false; } return true; }