题目链接:leetcode 914
给定一副牌,每张牌上都写着一个整数。
此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组:
每组都有 X 张牌。
组内所有的牌上都写着相同的整数。
仅当你可选的 X >= 2 时返回 true。
1)示例 1:
输入:deck = [1,2,3,4,4,3,2,1]
输出:true
解释:可行的分组是 [1,1],[2,2],[3,3],[4,4]
2)示例 2:
输入:deck = [1,1,1,2,2,2,3,3]
输出:false
解释:没有满足要求的分组。
3)提示:
1 <= deck.length <= 10^4
0 <= deck[i] < 10^4
首先对数组排序,我们可以得到每个数出现的次数,设它们出现的次数的数组为[a,b,c…],那么可行的分组最明显的是:
a=b=c。。。那么可以直接暴力地将同一个数分在一个组就行,但是存在反例,比如[2,2,4,4,4,4]的可行分组也可以是[2,2],[4,4],[4,4],我又想可以直接按照最少出现次数分,但是也存在反例,比如[2,2,2,2,4,4,4,4,4,4]也存在可行分组为[2,2],[2,2],[4,4],[4,4],[4,4]。那么可以发现当这些出现次数的最大公因数>2时,可以满足条件
class Solution {
public:
int gcd(int a,int b){
if(a>b) swap(a,b);
if(b%a==0) return a;
return gcd(b%a,a);
}
bool hasGroupsSizeX(vector<int>& deck) {
sort(deck.begin(),deck.end());
map<int,int> map1,map2;int a=0;
for(int i=0;i<deck.size();i++)
if(map1.count(deck[i])==0) {map1[deck[i]]=1;a++;}
else map1[deck[i]]++;
vector<int> test;
for(int i=0;i<deck.size();i++)
if(map2.count(deck[i])==0) {map2[deck[i]]=1;test.push_back(map1[deck[i]]);}
sort(test.begin(),test.end());
int ans=test[0];
for(int i=1;i<test.size();i++)
ans=gcd(ans,test[i]);
if(ans<2) return false;return true;
}
};