# 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 = 
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);
}
}```