59
59
60
60
<!-- 这里可写通用的实现逻辑 -->
61
61
62
- 并查集。
62
+ 并查集。对于本题, ` 可以移除的石头数量 = 石头总数 - 连通分量个数 ` 。遍历 ` stones ` 数组,将每个 ` stone ` 的横、纵坐标进行合并。需要注意的是,横、纵坐标数值可能相同,我们需要处理成不同的值,结合横、纵坐标的范围,我们只需要在其中一个坐标值加上 10010 即可。
63
63
64
- 并查集模板:
64
+ 以下是并查集的几个常用模板。
65
65
66
66
模板 1——朴素并查集:
67
67
@@ -129,20 +129,17 @@ d[find(a)] = distance
129
129
``` python
130
130
class Solution :
131
131
def removeStones (self , stones : List[List[int ]]) -> int :
132
- n = 10010
133
- p = list (range (n << 1 ))
134
-
135
132
def find (x ):
136
133
if p[x] != x:
137
134
p[x] = find(p[x])
138
135
return p[x]
139
136
137
+ n = 10010
138
+ p = list (range (n << 1 ))
140
139
for x, y in stones:
141
140
p[find(x)] = find(y + n)
142
141
143
- s = set ()
144
- for x, _ in stones:
145
- s.add(find(x))
142
+ s = {find(x) for x, _ in stones}
146
143
return len (stones) - len (s)
147
144
```
148
145
@@ -160,12 +157,12 @@ class Solution {
160
157
for (int i = 0 ; i < p. length; ++ i) {
161
158
p[i] = i;
162
159
}
163
- for (int [] e : stones) {
164
- p[find(e [0 ])] = find(e [1 ] + n);
160
+ for (int [] stone : stones) {
161
+ p[find(stone [0 ])] = find(stone [1 ] + n);
165
162
}
166
163
Set<Integer > s = new HashSet<> ();
167
- for (int [] e : stones) {
168
- s. add(find(e [0 ]));
164
+ for (int [] stone : stones) {
165
+ s. add(find(stone [0 ]));
169
166
}
170
167
return stones. length - s. size();
171
168
}
@@ -186,26 +183,18 @@ class Solution {
186
183
public:
187
184
vector<int > p;
188
185
189
- int removeStones(vector<vector<int>> & stones) {
186
+ int removeStones(vector<vector<int>>& stones) {
190
187
int n = 10010;
191
188
p.resize(n << 1);
192
- for (int i = 0; i < p.size(); ++i)
193
- p[i] = i;
194
- for (auto e : stones)
195
- {
196
- p[find(e[0])] = find(e[1] + 10010);
197
- }
189
+ for (int i = 0; i < p.size(); ++i) p[i] = i;
190
+ for (auto& stone : stones) p[find(stone[0])] = find(stone[1] + n);
198
191
unordered_set<int> s;
199
- for (auto e : stones)
200
- {
201
- s.insert(find(e[0]));
202
- }
192
+ for (auto& stone : stones) s.insert(find(stone[0]));
203
193
return stones.size() - s.size();
204
194
}
205
195
206
196
int find (int x) {
207
- if (p[x] != x)
208
- p[x] = find(p[x]);
197
+ if (p[ x] != x) p[ x] = find(p[ x] );
209
198
return p[ x] ;
210
199
}
211
200
};
@@ -214,30 +203,28 @@ public:
214
203
### **Go**
215
204
216
205
```go
217
- var p []int
218
-
219
206
func removeStones(stones [][]int) int {
220
207
n := 10010
221
- p = make ([]int , n<<1 )
222
- for i := 0 ; i < len (p); i++ {
208
+ p : = make([]int, n<<1)
209
+ for i := range p {
223
210
p[i] = i
224
211
}
225
- for _ , e := range stones {
226
- p[find (e[0 ])] = find (e[1 ] + n)
212
+ var find func(x int) int
213
+ find = func(x int) int {
214
+ if p[x] != x {
215
+ p[x] = find(p[x])
216
+ }
217
+ return p[x]
218
+ }
219
+ for _, stone := range stones {
220
+ p[find(stone[0])] = find(stone[1] + n)
227
221
}
228
222
s := make(map[int]bool)
229
- for _ , e := range stones {
230
- s[find (e [0 ])] = true
223
+ for _, stone := range stones {
224
+ s[find(stone [0])] = true
231
225
}
232
226
return len(stones) - len(s)
233
227
}
234
-
235
- func find (x int ) int {
236
- if p[x] != x {
237
- p[x] = find (p[x])
238
- }
239
- return p[x]
240
- }
241
228
```
242
229
243
230
### ** ...**
0 commit comments