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: deck = [1,2,3,4,4,3,2,1]
Output: true
Explanation: Possible partition [1,1],[2,2],[3,3],[4,4].
Example 2:
Input: deck = [1,1,1,2,2,2,3,3]
Output: false´
Explanation: No possible partition.
Example 3:
Input: deck = [1]
Output: false
Explanation: No possible partition.
Example 4:
Input: deck = [1,1]
Output: true
Explanation: Possible partition [1,1].
Example 5:
Input: deck = [1,1,2,2,2,2]
Output: true
Explanation: Possible partition [1,1],[2,2],[2,2].
Constraints:
1 <= deck.length <= 10^4
0 <= deck[i] < 10^4
这题核心在于每张牌的数量,是否能找出一个公约数出来。这里就直接暴力算法了,一个一个尝试:
class Solution {
public:
bool hasGroupsSizeX(vector<int>& deck) {
unordered_map<int, int> groups;
for (auto v : deck) {
auto it = groups.find(v);
if (it == groups.end()) {
groups.insert(std::make_pair(v, 1));
} else {
it->second++;
}
}
// Get the min cards in one group
int mincount = 0;
for (auto & v : groups) {
if (v.second < 2) {
return false;
}
if (0 == mincount) {
mincount = v.second;
} else {
mincount = std::min(v.second, mincount);
}
}
for (int i = 2; i <= mincount; i++) {
bool subok = true;
for (auto &v : groups) {
if (v.second % i != 0) {
subok = false;
break;
}
}
if (subok) {
return true;
}
}
return false;
}
};