47
47
48
48
<!-- 这里可写通用的实现逻辑 -->
49
49
50
+ ** 方法一:最大公约数**
51
+
52
+ 我们先用数组或哈希表 ` cnt ` 统计每个数字出现的次数,只有当 $X$ 是所有数字出现次数的约数时,即 $X$ 是所有 ` cnt[i] ` 的最大公约数的约数时,才能满足题意。
53
+
54
+ 因此,我们求出所有数字出现次数的最大公约数 $g$,然后判断其是否大于等于 $2$ 即可。
55
+
56
+ 时间复杂度 $O(n\log C)$,其中 $n$ 是数组 ` deck ` 的长度,而 $C$ 是数组 ` deck ` 中的最大值。
57
+
50
58
<!-- tabs:start -->
51
59
52
60
### ** Python3**
@@ -67,12 +75,12 @@ class Solution:
67
75
``` java
68
76
class Solution {
69
77
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 ];
73
81
}
74
82
int g = - 1 ;
75
- for (int v : counter ) {
83
+ for (int v : cnt ) {
76
84
if (v > 0 ) {
77
85
g = g == - 1 ? v : gcd(g, v);
78
86
}
@@ -92,38 +100,29 @@ class Solution {
92
100
class Solution {
93
101
public:
94
102
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 ] ;
97
105
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
+ }
101
111
return g >= 2;
102
112
}
103
-
104
- int gcd(int a, int b) {
105
- return b == 0 ? a : gcd(b, a % b);
106
- }
107
113
};
108
114
```
109
115
110
116
### **Go**
111
117
112
118
```go
113
119
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]++
124
123
}
125
124
g := -1
126
- for _ , v := range counter {
125
+ for _, v := range cnt {
127
126
if v > 0 {
128
127
if g == -1 {
129
128
g = v
@@ -134,6 +133,13 @@ func hasGroupsSizeX(deck []int) bool {
134
133
}
135
134
return g >= 2
136
135
}
136
+
137
+ func gcd(a, b int) int {
138
+ if b == 0 {
139
+ return a
140
+ }
141
+ return gcd(b, a%b)
142
+ }
137
143
```
138
144
139
145
### ** ...**
0 commit comments