题目:
In a deck of cards, each card has an integer written on it.
Return true
if and only if you can choose X >= 2
such that it is possible to split the entire deck into 1 or more groups of cards, where:
- Each group has exactly
X
cards. - All the cards in each group have the same integer.
Example 1:
Input: [1,2,3,4,4,3,2,1]
Output: true
Explanation: Possible partition [1,1],[2,2],[3,3],[4,4]
Example 2:
Input: [1,1,1,2,2,2,3,3]
Output: false
Explanation: No possible partition.
Example 3:
Input: [1]
Output: false
Explanation: No possible partition.
Example 4:
Input: [1,1]
Output: true
Explanation: Possible partition [1,1]
Example 5:
Input: [1,1,2,2,2,2]
Output: true
Explanation: Possible partition [1,1],[2,2],[2,2]
Note:
1 <= deck.length <= 10000
0 <= deck[i] < 10000
分析:
记录每个元素出现的个数,并求这些个数的最小公约数,如果最小公约数大于等于2,则为true,否则为false。
C++代码:
class Solution {
private:
int Gcd(int a, int b){
if(b == 0)
return a;
return Gcd(b, a % b);
}
public:
bool hasGroupsSizeX(vector<int>& deck) {
unordered_map<int,int> c;
for(int i=0; i<deck.size(); i++){
if(c.count(deck[i])==0){
c[deck[i]] =1;
}else{
c[deck[i]] ++;
}
}
set<int> s;
for(unordered_map<int,int>::iterator it=c.begin(); it!=c.end(); it++){
s.insert(it->second);
}
set<int>::iterator it = s.begin();
int number= *it;
it++;
for(; it!=s.end(); it++){
number = Gcd(number,*it);
}
if(number>=2) return true;
else return false;
}
};