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
Companies:
Google
// OJ: https://leetcode.com/problems/x-of-a-kind-in-a-deck-of-cards/
// Author: github.com/lzl124631x
// Time: O(N^2loglogN)
// Space: O(N)
class Solution {
public:
bool hasGroupsSizeX(vector<int>& deck) {
unordered_map<int, int> cnt;
for (int n : deck) cnt[n]++;
int minCnt = INT_MAX;
for (auto p : cnt) minCnt = min(minCnt, p.second);
if (minCnt == 1) return false;
for (int x = 2; x <= minCnt; ++x) {
bool found = true;
for (auto p : cnt) {
if (p.second % x) {
found = false;
break;
}
}
if (found) return true;
}
return false;
}
};