X of a Kind in a Deck of Cards
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
Solution:
class Solution {
public boolean hasGroupsSizeX(int[] deck) {
if (deck.length <= 1) return false;
Map<Integer, Integer> map = new HashMap();
int min = deck.length;
for (int val : deck) {
map.put(val, map.getOrDefault(val, 0) + 1);
}
Integer gcd = null;
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
int freq = entry.getValue();
if (gcd != null) {
gcd = gcd(freq, gcd);
if (gcd == 1) return false;
} else {
gcd = freq;
}
}
return true;
}
private int gcd(int x, int y) {
if (y == 0) return x;
return gcd(y, x % y);
}
}