Welcome to Subscribe On Youtube
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 wherex > 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; }