Skip to content

Commit 1f24920

Browse files
committed
feat: add solutions to lc problem: No.1020
No.1020.Number of Enclaves
1 parent e722f1d commit 1f24920

File tree

6 files changed

+449
-201
lines changed

6 files changed

+449
-201
lines changed

solution/1000-1099/1020.Number of Enclaves/README.md

+193-49
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,13 @@
4343

4444
<!-- 这里可写通用的实现逻辑 -->
4545

46-
并查集。
46+
**方法一:DFS**
4747

48-
模板 1——朴素并查集:
48+
从矩阵边缘所有 1 开始进行深搜,遇到 1 则改为 0。搜索结束后,统计剩余 1 的个数,即为结果。
49+
50+
**方法二:并查集**
51+
52+
并查集模板 1——朴素并查集:
4953

5054
```python
5155
# 初始化,p存储每个点的父节点
@@ -108,74 +112,139 @@ d[find(a)] = distance
108112

109113
<!-- 这里可写当前语言的特殊实现逻辑 -->
110114

115+
DFS:
116+
111117
```python
112118
class Solution:
113119
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+
114127
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+
并查集:
116136

137+
```python
138+
class Solution:
139+
def numEnclaves(self, grid: List[List[int]]) -> int:
117140
def find(x):
118141
if p[x] != x:
119142
p[x] = find(p[x])
120143
return p[x]
121144

145+
m, n = len(grid), len(grid[0])
146+
p = list(range(m * n + 1))
122147
for i in range(m):
123148
for j in range(n):
124149
if grid[i][j] == 1:
125150
if i == 0 or i == m - 1 or j == 0 or j == n - 1:
126151
p[find(i * n + j)] = find(m * n)
127152
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))
138158
```
139159

140160
### **Java**
141161

142162
<!-- 这里可写当前语言的特殊实现逻辑 -->
143163

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+
144210
```java
145211
class Solution {
146212
private int[] p;
147-
private int[][] dirs = new int[][]{{0, -1}, {0, 1}, {1, 0}, {-1, 0}};
148213

149214
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;
151217
p = new int[m * n + 1];
152218
for (int i = 0; i < p.length; ++i) {
153219
p[i] = i;
154220
}
221+
int[] dirs = {-1, 0, 1, 0, -1};
155222
for (int i = 0; i < m; ++i) {
156223
for (int j = 0; j < n; ++j) {
157224
if (grid[i][j] == 1) {
158225
if (i == 0 || i == m - 1 || j == 0 || j == n - 1) {
159226
p[find(i * n + j)] = find(m * n);
160227
} 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);
164233
}
165234
}
166235
}
167236
}
168237
}
169238
}
170-
int res = 0;
239+
int ans = 0;
171240
for (int i = 0; i < m; ++i) {
172241
for (int j = 0; j < n; ++j) {
173242
if (grid[i][j] == 1 && find(i * n + j) != find(m * n)) {
174-
++res;
243+
++ans;
175244
}
176245
}
177246
}
178-
return res;
247+
return ans;
179248
}
180249

181250
private int find(int x) {
@@ -189,15 +258,55 @@ class Solution {
189258

190259
### **C++**
191260

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+
192300
```cpp
193301
class Solution {
194302
public:
195303
vector<int> p;
196-
int dirs[4][2] = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}};
197304
198305
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();
200308
p.resize(m * n + 1);
309+
vector<int> dirs = {-1, 0, 1, 0, -1};
201310
for (int i = 0; i < p.size(); ++i) p[i] = i;
202311
for (int i = 0; i < m; ++i)
203312
{
@@ -208,23 +317,22 @@ public:
208317
if (i == 0 || i == m - 1 || j == 0 || j == n - 1) p[find(i * n + j)] = find(m * n);
209318
else
210319
{
211-
for (auto e : dirs)
320+
for (int k = 0; k < 4; ++k)
212321
{
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);
214325
}
215326
}
216327
}
217328
}
218329
}
219-
int res = 0;
330+
int ans = 0;
220331
for (int i = 0; i < m; ++i)
221-
{
222332
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;
228336
}
229337
230338
int find(int x) {
@@ -236,47 +344,83 @@ public:
236344

237345
### **Go**
238346

347+
DFS:
348+
239349
```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+
并查集:
241383

384+
```go
242385
func numEnclaves(grid [][]int) int {
243386
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 {
246389
p[i] = i
247390
}
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}
249399
for i := 0; i < m; i++ {
250400
for j := 0; j < n; j++ {
251401
if grid[i][j] == 1 {
252402
if i == 0 || i == m-1 || j == 0 || j == n-1 {
253403
p[find(i*n+j)] = find(m * n)
254404
} 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)
258409
}
259410
}
260411
}
261412
}
262413
}
263414
}
264-
res := 0
415+
ans := 0
265416
for i := 0; i < m; i++ {
266417
for j := 0; j < n; j++ {
267418
if grid[i][j] == 1 && find(i*n+j) != find(m*n) {
268-
res++
419+
ans++
269420
}
270421
}
271422
}
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
280424
}
281425
```
282426

0 commit comments

Comments
 (0)