leetcode 914. 卡牌分组

题目链接:leetcode 914

1.题目

给定一副牌,每张牌上都写着一个整数。

此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组:

每组都有 X 张牌。
组内所有的牌上都写着相同的整数。
仅当你可选的 X >= 2 时返回 true。

2.示例

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

3.分析

首先对数组排序,我们可以得到每个数出现的次数,设它们出现的次数的数组为[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时,可以满足条件

4.代码

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;
    }
};

你可能感兴趣的:(leetcode,leetcode,算法)