# 914. X of a Kind in a Deck of Cards

## Description

You are given an integer array deck where deck[i] represents the number written on the ith card.

Partition the cards into one or more groups such that:

• Each group has exactly x cards where x > 1, and
• All the cards in one group have the same integer written on them.

Return true if such partition is possible, or false otherwise.

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.


Constraints:

• 1 <= deck.length <= 104
• 0 <= deck[i] < 104

## Solutions

• class Solution {
public boolean hasGroupsSizeX(int[] deck) {
int[] cnt = new int[10000];
for (int v : deck) {
++cnt[v];
}
int g = -1;
for (int v : cnt) {
if (v > 0) {
g = g == -1 ? v : gcd(g, v);
}
}
return g >= 2;
}

private int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
}

• class Solution {
public:
bool hasGroupsSizeX(vector<int>& deck) {
int cnt[10000] = {0};
for (int& v : deck) ++cnt[v];
int g = -1;
for (int& v : cnt) {
if (v) {
g = g == -1 ? v : __gcd(g, v);
}
}
return g >= 2;
}
};

• class Solution:
def hasGroupsSizeX(self, deck: List[int]) -> bool:
vals = Counter(deck).values()
return reduce(gcd, vals) >= 2


• func hasGroupsSizeX(deck []int) bool {
cnt := make([]int, 10000)
for _, v := range deck {
cnt[v]++
}
g := -1
for _, v := range cnt {
if v > 0 {
if g == -1 {
g = v
} else {
g = gcd(g, v)
}
}
}
return g >= 2
}

func gcd(a, b int) int {
if b == 0 {
return a
}
return gcd(b, a%b)
}

• function hasGroupsSizeX(deck: number[]): boolean {
const cnt: Record<number, number> = {};
for (const x of deck) {
cnt[x] = (cnt[x] || 0) + 1;
}
const gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));
let g = cnt[deck[0]];
for (const [_, x] of Object.entries(cnt)) {
g = gcd(g, x);
}
return g >= 2;
}