43
43
44
44
<!-- 这里可写通用的实现逻辑 -->
45
45
46
- 并查集。
46
+ ** 方法一:DFS **
47
47
48
- 模板 1——朴素并查集:
48
+ 从矩阵边缘所有 1 开始进行深搜,遇到 1 则改为 0。搜索结束后,统计剩余 1 的个数,即为结果。
49
+
50
+ ** 方法二:并查集**
51
+
52
+ 并查集模板 1——朴素并查集:
49
53
50
54
``` python
51
55
# 初始化,p存储每个点的父节点
@@ -108,74 +112,139 @@ d[find(a)] = distance
108
112
109
113
<!-- 这里可写当前语言的特殊实现逻辑 -->
110
114
115
+ DFS:
116
+
111
117
``` python
112
118
class Solution :
113
119
def numEnclaves (self , grid : List[List[int ]]) -> int :
120
+ def dfs (i , j ):
121
+ grid[i][j] = 0
122
+ for a, b in [[0 , - 1 ], [0 , 1 ], [- 1 , 0 ], [1 , 0 ]]:
123
+ x, y = i + a, j + b
124
+ if 0 <= x < m and 0 <= y < n and grid[x][y] == 1 :
125
+ dfs(x, y)
126
+
114
127
m, n = len (grid), len (grid[0 ])
115
- p = list (range (m * n + 1 ))
128
+ for i in range (m):
129
+ for j in range (n):
130
+ if grid[i][j] == 1 and (i == 0 or i == m - 1 or j == 0 or j == n - 1 ):
131
+ dfs(i, j)
132
+ return sum (grid[i][j] for i in range (m) for j in range (n))
133
+ ```
134
+
135
+ 并查集:
116
136
137
+ ``` python
138
+ class Solution :
139
+ def numEnclaves (self , grid : List[List[int ]]) -> int :
117
140
def find (x ):
118
141
if p[x] != x:
119
142
p[x] = find(p[x])
120
143
return p[x]
121
144
145
+ m, n = len (grid), len (grid[0 ])
146
+ p = list (range (m * n + 1 ))
122
147
for i in range (m):
123
148
for j in range (n):
124
149
if grid[i][j] == 1 :
125
150
if i == 0 or i == m - 1 or j == 0 or j == n - 1 :
126
151
p[find(i * n + j)] = find(m * n)
127
152
else :
128
- for x, y in [[0 , 1 ], [0 , - 1 ], [1 , 0 ], [- 1 , 0 ]]:
129
- if grid[i + x][j + y] == 1 :
130
- p[find(i * n + j)] = find((i + x) * n + j + y)
131
-
132
- res = 0
133
- for i in range (m):
134
- for j in range (n):
135
- if grid[i][j] == 1 and find(i * n + j) != find(m * n):
136
- res += 1
137
- return res
153
+ for a, b in [[0 , - 1 ], [0 , 1 ], [- 1 , 0 ], [1 , 0 ]]:
154
+ x, y = i + a, j + b
155
+ if grid[x][y] == 1 :
156
+ p[find(i * n + j)] = find(x * n + y)
157
+ return sum (grid[i][j] == 1 and find(i * n + j) != find(m * n) for i in range (m) for j in range (n))
138
158
```
139
159
140
160
### ** Java**
141
161
142
162
<!-- 这里可写当前语言的特殊实现逻辑 -->
143
163
164
+ DFS:
165
+
166
+ ``` java
167
+ class Solution {
168
+ private int [][] grid;
169
+ private int m;
170
+ private int n;
171
+
172
+ public int numEnclaves (int [][] grid ) {
173
+ m = grid. length;
174
+ n = grid[0 ]. length;
175
+ this . grid = grid;
176
+ for (int i = 0 ; i < m; ++ i) {
177
+ for (int j = 0 ; j < n; ++ j) {
178
+ if (grid[i][j] == 1 && (i == 0 || i == m - 1 || j == 0 || j == n - 1 )) {
179
+ dfs(i, j);
180
+ }
181
+ }
182
+ }
183
+ int ans = 0 ;
184
+ for (int i = 0 ; i < m; ++ i) {
185
+ for (int j = 0 ; j < n; ++ j) {
186
+ if (grid[i][j] == 1 ) {
187
+ ++ ans;
188
+ }
189
+ }
190
+ }
191
+ return ans;
192
+ }
193
+
194
+ private void dfs (int i , int j ) {
195
+ grid[i][j] = 0 ;
196
+ int [] dirs = {- 1 , 0 , 1 , 0 , - 1 };
197
+ for (int k = 0 ; k < 4 ; ++ k) {
198
+ int x = i + dirs[k];
199
+ int y = j + dirs[k + 1 ];
200
+ if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1 ) {
201
+ dfs(x, y);
202
+ }
203
+ }
204
+ }
205
+ }
206
+ ```
207
+
208
+ 并查集:
209
+
144
210
``` java
145
211
class Solution {
146
212
private int [] p;
147
- private int [][] dirs = new int [][]{{0 , - 1 }, {0 , 1 }, {1 , 0 }, {- 1 , 0 }};
148
213
149
214
public int numEnclaves (int [][] grid ) {
150
- int m = grid. length, n = grid[0 ]. length;
215
+ int m = grid. length;
216
+ int n = grid[0 ]. length;
151
217
p = new int [m * n + 1 ];
152
218
for (int i = 0 ; i < p. length; ++ i) {
153
219
p[i] = i;
154
220
}
221
+ int [] dirs = {- 1 , 0 , 1 , 0 , - 1 };
155
222
for (int i = 0 ; i < m; ++ i) {
156
223
for (int j = 0 ; j < n; ++ j) {
157
224
if (grid[i][j] == 1 ) {
158
225
if (i == 0 || i == m - 1 || j == 0 || j == n - 1 ) {
159
226
p[find(i * n + j)] = find(m * n);
160
227
} else {
161
- for (int [] e : dirs) {
162
- if (grid[i + e[0 ]][j + e[1 ]] == 1 ) {
163
- p[find(i * n + j)] = find((i + e[0 ]) * n + j + e[1 ]);
228
+ for (int k = 0 ; k < 4 ; ++ k) {
229
+ int x = i + dirs[k];
230
+ int y = j + dirs[k + 1 ];
231
+ if (grid[x][y] == 1 ) {
232
+ p[find(i * n + j)] = find(x * n + y);
164
233
}
165
234
}
166
235
}
167
236
}
168
237
}
169
238
}
170
- int res = 0 ;
239
+ int ans = 0 ;
171
240
for (int i = 0 ; i < m; ++ i) {
172
241
for (int j = 0 ; j < n; ++ j) {
173
242
if (grid[i][j] == 1 && find(i * n + j) != find(m * n)) {
174
- ++ res ;
243
+ ++ ans ;
175
244
}
176
245
}
177
246
}
178
- return res ;
247
+ return ans ;
179
248
}
180
249
181
250
private int find (int x ) {
@@ -189,15 +258,55 @@ class Solution {
189
258
190
259
### ** C++**
191
260
261
+ DFS:
262
+
263
+ ``` cpp
264
+ class Solution {
265
+ public:
266
+ int m;
267
+ int n;
268
+
269
+ int numEnclaves(vector<vector<int>>& grid) {
270
+ m = grid.size();
271
+ n = grid[0].size();
272
+ for (int i = 0; i < m; ++i)
273
+ for (int j = 0; j < n; ++j)
274
+ if (grid[i][j] == 1 && (i == 0 || i == m - 1 || j == 0 || j == n - 1))
275
+ dfs(i, j, grid);
276
+ int ans = 0;
277
+ for (int i = 0; i < m; ++i)
278
+ for (int j = 0; j < n; ++j)
279
+ if (grid[i][j] == 1)
280
+ ++ans;
281
+ return ans;
282
+ }
283
+
284
+ void dfs (int i, int j, vector<vector<int >>& grid) {
285
+ grid[ i] [ j ] = 0;
286
+ vector<int > dirs = {-1, 0, 1, 0, -1};
287
+ for (int k = 0; k < 4; ++k)
288
+ {
289
+ int x = i + dirs[ k] ;
290
+ int y = j + dirs[ k + 1] ;
291
+ if (x >= 0 && x < m && y >= 0 && y < n && grid[ x] [ y ] == 1)
292
+ dfs(x, y, grid);
293
+ }
294
+ }
295
+ };
296
+ ```
297
+
298
+ 并查集:
299
+
192
300
```cpp
193
301
class Solution {
194
302
public:
195
303
vector<int> p;
196
- int dirs[ 4] [ 2 ] = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}};
197
304
198
305
int numEnclaves(vector<vector<int>>& grid) {
199
- int m = grid.size(), n = grid[0].size();
306
+ int m = grid.size();
307
+ int n = grid[0].size();
200
308
p.resize(m * n + 1);
309
+ vector<int> dirs = {-1, 0, 1, 0, -1};
201
310
for (int i = 0; i < p.size(); ++i) p[i] = i;
202
311
for (int i = 0; i < m; ++i)
203
312
{
@@ -208,23 +317,22 @@ public:
208
317
if (i == 0 || i == m - 1 || j == 0 || j == n - 1) p[find(i * n + j)] = find(m * n);
209
318
else
210
319
{
211
- for (auto e : dirs )
320
+ for (int k = 0; k < 4; ++k )
212
321
{
213
- if (grid[i + e[0]][j + e[1]] == 1) p[find(i * n + j)] = find((i + e[0]) * n + j + e[1]);
322
+ int x = i + dirs[k];
323
+ int y = j + dirs[k + 1];
324
+ if (grid[x][y] == 1) p[find(i * n + j)] = find(x * n + y);
214
325
}
215
326
}
216
327
}
217
328
}
218
329
}
219
- int res = 0 ;
330
+ int ans = 0;
220
331
for (int i = 0; i < m; ++i)
221
- {
222
332
for (int j = 0; j < n; ++j)
223
- {
224
- if (grid[i][j] == 1 && find(i * n + j) != find(m * n)) ++res;
225
- }
226
- }
227
- return res;
333
+ if (grid[i][j] == 1 && find(i * n + j) != find(m * n))
334
+ ++ans;
335
+ return ans;
228
336
}
229
337
230
338
int find(int x) {
@@ -236,47 +344,83 @@ public:
236
344
237
345
### ** Go**
238
346
347
+ DFS:
348
+
239
349
``` go
240
- var p []int
350
+ func numEnclaves (grid [][]int ) int {
351
+ m , n := len (grid), len (grid[0 ])
352
+ dirs := []int {-1 , 0 , 1 , 0 , -1 }
353
+ var dfs func (i, j int )
354
+ dfs = func (i, j int ) {
355
+ grid[i][j] = 0
356
+ for k := 0 ; k < 4 ; k++ {
357
+ x , y := i+dirs[k], j+dirs[k+1 ]
358
+ if x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1 {
359
+ dfs (x, y)
360
+ }
361
+ }
362
+ }
363
+ for i := 0 ; i < m; i++ {
364
+ for j := 0 ; j < n; j++ {
365
+ if grid[i][j] == 1 && (i == 0 || i == m-1 || j == 0 || j == n-1 ) {
366
+ dfs (i, j)
367
+ }
368
+ }
369
+ }
370
+ ans := 0
371
+ for i := 0 ; i < m; i++ {
372
+ for j := 0 ; j < n; j++ {
373
+ if grid[i][j] == 1 {
374
+ ans++
375
+ }
376
+ }
377
+ }
378
+ return ans
379
+ }
380
+ ```
381
+
382
+ 并查集:
241
383
384
+ ``` go
242
385
func numEnclaves (grid [][]int ) int {
243
386
m , n := len (grid), len (grid[0 ])
244
- p = make ([]int , m*n+1 )
245
- for i := 0 ; i < len (p); i++ {
387
+ p : = make ([]int , m*n+1 )
388
+ for i := range p {
246
389
p[i] = i
247
390
}
248
- dirs := [4 ][2 ]int {{0 , -1 }, {0 , 1 }, {1 , 0 }, {-1 , 0 }}
391
+ var find func (x int ) int
392
+ find = func (x int ) int {
393
+ if p[x] != x {
394
+ p[x] = find (p[x])
395
+ }
396
+ return p[x]
397
+ }
398
+ dirs := []int {-1 , 0 , 1 , 0 , -1 }
249
399
for i := 0 ; i < m; i++ {
250
400
for j := 0 ; j < n; j++ {
251
401
if grid[i][j] == 1 {
252
402
if i == 0 || i == m-1 || j == 0 || j == n-1 {
253
403
p[find (i*n+j)] = find (m * n)
254
404
} else {
255
- for _ , e := range dirs {
256
- if grid[i+e[0 ]][j+e[1 ]] == 1 {
257
- p[find (i*n+j)] = find ((i+e[0 ])*n + j + e[1 ])
405
+ for k := 0 ; k < 4 ; k++ {
406
+ x , y := i+dirs[k], j+dirs[k+1 ]
407
+ if grid[x][y] == 1 {
408
+ p[find (i*n+j)] = find (x*n + y)
258
409
}
259
410
}
260
411
}
261
412
}
262
413
}
263
414
}
264
- res := 0
415
+ ans := 0
265
416
for i := 0 ; i < m; i++ {
266
417
for j := 0 ; j < n; j++ {
267
418
if grid[i][j] == 1 && find (i*n+j) != find (m*n) {
268
- res ++
419
+ ans ++
269
420
}
270
421
}
271
422
}
272
- return res
273
- }
274
-
275
- func find (x int ) int {
276
- if p[x] != x {
277
- p[x] = find (p[x])
278
- }
279
- return p[x]
423
+ return ans
280
424
}
281
425
```
282
426
0 commit comments