Skip to content

Commit d64815c

Browse files
committed
feat: add solutions to lc problem: No.0914
* No.0914.X of a Kind in a Deck of Cards
1 parent 42e7f87 commit d64815c

File tree

5 files changed

+74
-72
lines changed

5 files changed

+74
-72
lines changed

solution/0900-0999/0914.X of a Kind in a Deck of Cards/README.md

+30-24
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,14 @@
4747

4848
<!-- 这里可写通用的实现逻辑 -->
4949

50+
**方法一:最大公约数**
51+
52+
我们先用数组或哈希表 `cnt` 统计每个数字出现的次数,只有当 $X$ 是所有数字出现次数的约数时,即 $X$ 是所有 `cnt[i]` 的最大公约数的约数时,才能满足题意。
53+
54+
因此,我们求出所有数字出现次数的最大公约数 $g$,然后判断其是否大于等于 $2$ 即可。
55+
56+
时间复杂度 $O(n\log C)$,其中 $n$ 是数组 `deck` 的长度,而 $C$ 是数组 `deck` 中的最大值。
57+
5058
<!-- tabs:start -->
5159

5260
### **Python3**
@@ -67,12 +75,12 @@ class Solution:
6775
```java
6876
class Solution {
6977
public boolean hasGroupsSizeX(int[] deck) {
70-
int[] counter = new int[10000];
71-
for (int d : deck) {
72-
++counter[d];
78+
int[] cnt = new int[10000];
79+
for (int v : deck) {
80+
++cnt[v];
7381
}
7482
int g = -1;
75-
for (int v : counter) {
83+
for (int v : cnt) {
7684
if (v > 0) {
7785
g = g == -1 ? v : gcd(g, v);
7886
}
@@ -92,38 +100,29 @@ class Solution {
92100
class Solution {
93101
public:
94102
bool hasGroupsSizeX(vector<int>& deck) {
95-
vector<int> counter(10000);
96-
for (int& d : deck) ++counter[d];
103+
int cnt[10000] = {0};
104+
for (int& v : deck) ++cnt[v];
97105
int g = -1;
98-
for (int& v : counter)
99-
if (v > 0)
100-
g = g == -1 ? v : gcd(g, v);
106+
for (int& v : cnt) {
107+
if (v) {
108+
g = g == -1 ? v : __gcd(g, v);
109+
}
110+
}
101111
return g >= 2;
102112
}
103-
104-
int gcd(int a, int b) {
105-
return b == 0 ? a : gcd(b, a % b);
106-
}
107113
};
108114
```
109115
110116
### **Go**
111117
112118
```go
113119
func hasGroupsSizeX(deck []int) bool {
114-
counter := make([]int, 10000)
115-
for _, d := range deck {
116-
counter[d]++
117-
}
118-
var gcd func(a, b int) int
119-
gcd = func(a, b int) int {
120-
if b == 0 {
121-
return a
122-
}
123-
return gcd(b, a%b)
120+
cnt := make([]int, 10000)
121+
for _, v := range deck {
122+
cnt[v]++
124123
}
125124
g := -1
126-
for _, v := range counter {
125+
for _, v := range cnt {
127126
if v > 0 {
128127
if g == -1 {
129128
g = v
@@ -134,6 +133,13 @@ func hasGroupsSizeX(deck []int) bool {
134133
}
135134
return g >= 2
136135
}
136+
137+
func gcd(a, b int) int {
138+
if b == 0 {
139+
return a
140+
}
141+
return gcd(b, a%b)
142+
}
137143
```
138144

139145
### **...**

solution/0900-0999/0914.X of a Kind in a Deck of Cards/README_EN.md

+22-24
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,12 @@ class Solution:
5858
```java
5959
class Solution {
6060
public boolean hasGroupsSizeX(int[] deck) {
61-
int[] counter = new int[10000];
62-
for (int d : deck) {
63-
++counter[d];
61+
int[] cnt = new int[10000];
62+
for (int v : deck) {
63+
++cnt[v];
6464
}
6565
int g = -1;
66-
for (int v : counter) {
66+
for (int v : cnt) {
6767
if (v > 0) {
6868
g = g == -1 ? v : gcd(g, v);
6969
}
@@ -83,38 +83,29 @@ class Solution {
8383
class Solution {
8484
public:
8585
bool hasGroupsSizeX(vector<int>& deck) {
86-
vector<int> counter(10000);
87-
for (int& d : deck) ++counter[d];
86+
int cnt[10000] = {0};
87+
for (int& v : deck) ++cnt[v];
8888
int g = -1;
89-
for (int& v : counter)
90-
if (v > 0)
91-
g = g == -1 ? v : gcd(g, v);
89+
for (int& v : cnt) {
90+
if (v) {
91+
g = g == -1 ? v : __gcd(g, v);
92+
}
93+
}
9294
return g >= 2;
9395
}
94-
95-
int gcd(int a, int b) {
96-
return b == 0 ? a : gcd(b, a % b);
97-
}
9896
};
9997
```
10098
10199
### **Go**
102100
103101
```go
104102
func hasGroupsSizeX(deck []int) bool {
105-
counter := make([]int, 10000)
106-
for _, d := range deck {
107-
counter[d]++
108-
}
109-
var gcd func(a, b int) int
110-
gcd = func(a, b int) int {
111-
if b == 0 {
112-
return a
113-
}
114-
return gcd(b, a%b)
103+
cnt := make([]int, 10000)
104+
for _, v := range deck {
105+
cnt[v]++
115106
}
116107
g := -1
117-
for _, v := range counter {
108+
for _, v := range cnt {
118109
if v > 0 {
119110
if g == -1 {
120111
g = v
@@ -125,6 +116,13 @@ func hasGroupsSizeX(deck []int) bool {
125116
}
126117
return g >= 2
127118
}
119+
120+
func gcd(a, b int) int {
121+
if b == 0 {
122+
return a
123+
}
124+
return gcd(b, a%b)
125+
}
128126
```
129127

130128
### **...**
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
class Solution {
22
public:
33
bool hasGroupsSizeX(vector<int>& deck) {
4-
vector<int> counter(10000);
5-
for (int& d : deck) ++counter[d];
4+
int cnt[10000] = {0};
5+
for (int& v : deck) ++cnt[v];
66
int g = -1;
7-
for (int& v : counter)
8-
if (v > 0)
9-
g = g == -1 ? v : gcd(g, v);
7+
for (int& v : cnt) {
8+
if (v) {
9+
g = g == -1 ? v : __gcd(g, v);
10+
}
11+
}
1012
return g >= 2;
1113
}
12-
13-
int gcd(int a, int b) {
14-
return b == 0 ? a : gcd(b, a % b);
15-
}
1614
};
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,10 @@
11
func hasGroupsSizeX(deck []int) bool {
2-
counter := make([]int, 10000)
3-
for _, d := range deck {
4-
counter[d]++
5-
}
6-
var gcd func(a, b int) int
7-
gcd = func(a, b int) int {
8-
if b == 0 {
9-
return a
10-
}
11-
return gcd(b, a%b)
2+
cnt := make([]int, 10000)
3+
for _, v := range deck {
4+
cnt[v]++
125
}
136
g := -1
14-
for _, v := range counter {
7+
for _, v := range cnt {
158
if v > 0 {
169
if g == -1 {
1710
g = v
@@ -21,4 +14,11 @@ func hasGroupsSizeX(deck []int) bool {
2114
}
2215
}
2316
return g >= 2
17+
}
18+
19+
func gcd(a, b int) int {
20+
if b == 0 {
21+
return a
22+
}
23+
return gcd(b, a%b)
2424
}

solution/0900-0999/0914.X of a Kind in a Deck of Cards/Solution.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
class Solution {
22
public boolean hasGroupsSizeX(int[] deck) {
3-
int[] counter = new int[10000];
4-
for (int d : deck) {
5-
++counter[d];
3+
int[] cnt = new int[10000];
4+
for (int v : deck) {
5+
++cnt[v];
66
}
77
int g = -1;
8-
for (int v : counter) {
8+
for (int v : cnt) {
99
if (v > 0) {
1010
g = g == -1 ? v : gcd(g, v);
1111
}

0 commit comments

Comments
 (0)