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#
Solution 1#
1
2
3
4
| class Solution:
def hasGroupsSizeX(self, deck: List[int]) -> bool:
vals = Counter(deck).values()
return reduce(gcd, vals) >= 2
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| 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);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| 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;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| 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)
}
|