Skip to content

Commit 0d7a902

Browse files
committed
feat: add solutions to lc problem: No.1905
No.1905.Count Sub Islands
1 parent b905163 commit 0d7a902

File tree

2 files changed

+317
-60
lines changed

2 files changed

+317
-60
lines changed

solution/1900-1999/1905.Count Sub Islands/README.md

Lines changed: 181 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,38 @@ grid2 中标红的 1 区域是子岛屿,总共有 2 个子岛屿。
4545

4646
<!-- 这里可写通用的实现逻辑 -->
4747

48-
深度优先搜索,或者并查集。
48+
BFS、DFS 或者并查集。
4949

5050
<!-- tabs:start -->
5151

5252
### **Python3**
5353

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

56+
BFS - Flood Fill 算法:
57+
58+
```python
59+
class Solution:
60+
def countSubIslands(self, grid1: List[List[int]], grid2: List[List[int]]) -> int:
61+
def bfs(i, j):
62+
q = deque([(i, j)])
63+
grid2[i][j] = 0
64+
ans = True
65+
while q:
66+
i, j = q.popleft()
67+
if grid1[i][j] == 0:
68+
ans = False
69+
for a, b in [[0, -1], [0, 1], [1, 0], [-1, 0]]:
70+
x, y = i + a, j + b
71+
if 0 <= x < m and 0 <= y < n and grid2[x][y]:
72+
q.append((x, y))
73+
grid2[x][y] = 0
74+
return ans
75+
76+
m, n = len(grid1), len(grid1[0])
77+
return sum(grid2[i][j] and bfs(i, j) for i in range(m) for j in range(n))
78+
```
79+
5680
DFS:
5781

5882
```python
@@ -76,27 +100,24 @@ class Solution:
76100
```python
77101
class Solution:
78102
def countSubIslands(self, grid1: List[List[int]], grid2: List[List[int]]) -> int:
79-
m, n = len(grid1), len(grid1[0])
80-
p = list(range(m * n))
81-
82103
def find(x):
83104
if p[x] != x:
84105
p[x] = find(p[x])
85106
return p[x]
86-
107+
108+
m, n = len(grid1), len(grid1[0])
109+
p = list(range(m * n))
87110
for i in range(m):
88111
for j in range(n):
89-
if grid2[i][j] == 1:
90-
idx = i * n + j
91-
if i < m - 1 and grid2[i + 1][j] == 1:
92-
p[find(idx)] = find((i + 1) * n + j)
93-
if j < n - 1 and grid2[i][j + 1] == 1:
94-
p[find(idx)] = find(i * n + j + 1)
95-
112+
if grid2[i][j]:
113+
for a, b in [[0, 1], [1, 0]]:
114+
x, y = i + a, j + b
115+
if x < m and y < n and grid2[x][y]:
116+
p[find(x * n + y)] = find(i * n + j)
96117
s = [0] * (m * n)
97118
for i in range(m):
98119
for j in range(n):
99-
if grid2[i][j] == 1:
120+
if grid2[i][j]:
100121
s[find(i * n + j)] = 1
101122
for i in range(m):
102123
for j in range(n):
@@ -110,6 +131,51 @@ class Solution:
110131

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

134+
BFS - Flood Fill 算法:
135+
136+
```java
137+
class Solution {
138+
public int countSubIslands(int[][] grid1, int[][] grid2) {
139+
int m = grid1.length;
140+
int n = grid1[0].length;
141+
int ans = 0;
142+
for (int i = 0; i < m; ++i) {
143+
for (int j = 0; j < n; ++j) {
144+
if (grid2[i][j] == 1 && bfs(i, j, m, n, grid1, grid2)) {
145+
++ans;
146+
}
147+
}
148+
}
149+
return ans;
150+
}
151+
152+
private boolean bfs(int i, int j, int m, int n, int[][] grid1, int[][] grid2) {
153+
Queue<int[]> q = new ArrayDeque<>();
154+
grid2[i][j] = 0;
155+
q.offer(new int[]{i, j});
156+
boolean ans = true;
157+
int[] dirs = {-1, 0, 1, 0, -1};
158+
while (!q.isEmpty()) {
159+
int[] p = q.poll();
160+
i = p[0];
161+
j = p[1];
162+
if (grid1[i][j] == 0) {
163+
ans = false;
164+
}
165+
for (int k = 0; k < 4; ++k) {
166+
int x = i + dirs[k];
167+
int y = j + dirs[k + 1];
168+
if (x >= 0 && x < m && y >= 0 && y < n && grid2[x][y] == 1) {
169+
q.offer(new int[]{x, y});
170+
grid2[x][y] = 0;
171+
}
172+
}
173+
}
174+
return ans;
175+
}
176+
}
177+
```
178+
113179
DFS:
114180

115181
```java
@@ -151,47 +217,47 @@ class Solution {
151217
private int[] p;
152218

153219
public int countSubIslands(int[][] grid1, int[][] grid2) {
154-
int m = grid2.length, n = grid2[0].length;
220+
int m = grid1.length;
221+
int n = grid1[0].length;
155222
p = new int[m * n];
156223
for (int i = 0; i < p.length; ++i) {
157224
p[i] = i;
158225
}
226+
int[] dirs = {1, 0, 1};
159227
for (int i = 0; i < m; ++i) {
160228
for (int j = 0; j < n; ++j) {
161229
if (grid2[i][j] == 1) {
162-
int idx = i * n + j;
163-
if (i < m - 1 && grid2[i + 1][j] == 1) {
164-
p[find(idx)] = find((i + 1) * n + j);
165-
}
166-
if (j < n - 1 && grid2[i][j + 1] == 1) {
167-
p[find(idx)] = find(i * n + j + 1);
230+
for (int k = 0; k < 2; ++k) {
231+
int x = i + dirs[k];
232+
int y = j + dirs[k + 1];
233+
if (x < m && y < n && grid2[x][y] == 1) {
234+
p[find(x * n + y)] = find(i * n + j);
235+
}
168236
}
169237
}
170238
}
171239
}
172-
boolean[] s = new boolean[m * n];
240+
int[] s = new int[m * n];
173241
for (int i = 0; i < m; ++i) {
174242
for (int j = 0; j < n; ++j) {
175243
if (grid2[i][j] == 1) {
176-
s[find(i * n + j)] = true;
244+
s[find(i * n + j)] = 1;
177245
}
178246
}
179247
}
180248
for (int i = 0; i < m; ++i) {
181249
for (int j = 0; j < n; ++j) {
182250
int root = find(i * n + j);
183-
if (s[root] && grid1[i][j] == 0) {
184-
s[root] = false;
251+
if (s[root] == 1 && grid1[i][j] == 0) {
252+
s[root] = 0;
185253
}
186254
}
187255
}
188-
int res = 0;
189-
for (boolean e : s) {
190-
if (e) {
191-
++res;
192-
}
256+
int ans = 0;
257+
for (int i = 0; i < s.length; ++i) {
258+
ans += s[i];
193259
}
194-
return res;
260+
return ans;
195261
}
196262

197263
private int find(int x) {
@@ -254,6 +320,51 @@ function dfs(
254320

255321
### **C++**
256322

323+
BFS - Flood Fill 算法:
324+
325+
```cpp
326+
class Solution {
327+
public:
328+
int countSubIslands(vector<vector<int>>& grid1, vector<vector<int>>& grid2) {
329+
int m = grid1.size();
330+
int n = grid1[0].size();
331+
int ans = 0;
332+
for (int i = 0; i < m; ++i)
333+
for (int j = 0; j < n; ++j)
334+
ans += (grid2[i][j] == 1 && bfs(i, j, m, n, grid1, grid2));
335+
return ans;
336+
}
337+
338+
bool bfs(int i, int j, int m, int n, vector<vector<int>>& grid1, vector<vector<int>>& grid2) {
339+
queue<pair<int, int>> q;
340+
q.push({i, j});
341+
grid2[i][j] = 0;
342+
bool ans = true;
343+
vector<int> dirs = {-1, 0, 1, 0, -1};
344+
while (!q.empty())
345+
{
346+
auto p = q.front();
347+
q.pop();
348+
i = p.first;
349+
j = p.second;
350+
if (grid1[i][j] == 0) ans = false;
351+
for (int k = 0; k < 4; ++k)
352+
{
353+
int x = i + dirs[k], y = j + dirs[k + 1];
354+
if (x >= 0 && x < m && y >= 0 && y < n && grid2[x][y])
355+
{
356+
q.push({x, y});
357+
grid2[x][y] = 0;
358+
}
359+
}
360+
}
361+
return ans;
362+
}
363+
};
364+
```
365+
366+
DFS:
367+
257368
```cpp
258369
class Solution {
259370
public:
@@ -285,6 +396,46 @@ public:
285396

286397
### **Go**
287398

399+
BFS - Flood Fill 算法:
400+
401+
```go
402+
func countSubIslands(grid1 [][]int, grid2 [][]int) int {
403+
m, n := len(grid1), len(grid1[0])
404+
ans := 0
405+
bfs := func(i, j int) bool {
406+
q := [][]int{{i, j}}
407+
grid2[i][j] = 0
408+
res := true
409+
dirs := []int{-1, 0, 1, 0, -1}
410+
for len(q) > 0 {
411+
i, j = q[0][0], q[0][1]
412+
if grid1[i][j] == 0 {
413+
res = false
414+
}
415+
q = q[1:]
416+
for k := 0; k < 4; k++ {
417+
x, y := i+dirs[k], j+dirs[k+1]
418+
if x >= 0 && x < m && y >= 0 && y < n && grid2[x][y] == 1 {
419+
q = append(q, []int{x, y})
420+
grid2[x][y] = 0
421+
}
422+
}
423+
}
424+
return res
425+
}
426+
for i := 0; i < m; i++ {
427+
for j := 0; j < n; j++ {
428+
if grid2[i][j] == 1 && bfs(i, j) {
429+
ans++
430+
}
431+
}
432+
}
433+
return ans
434+
}
435+
```
436+
437+
DFS:
438+
288439
```go
289440
func countSubIslands(grid1 [][]int, grid2 [][]int) int {
290441
m, n := len(grid1), len(grid1[0])

0 commit comments

Comments
 (0)