echo

任生命穿梭 时间的角落

0%

岛屿数量

200. 岛屿数量

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

1
2
3
4
5
6
输入:
11110
11010
11000
00000
输出: 1

示例 2:

1
2
3
4
5
6
7
输入:
11000
11000
00100
00011
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

我们可以将二维网格看成一个无向图,竖直或水平相邻的 1 之间有边相连。为了求出岛屿的数量,我们可以扫描整个二维网格。如果一个位置为 1 ,则以其为起始结点开始进行深度优先搜索。在深度优先搜索的过程中,每个搜索到的 1 都会被重新标记为 0。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
public int numIslands(char[][] grid) {
int rows = grid.length;
if(rows == 0) return 0;
int cols = grid[0].length;
int count = 0;

//对网格中的每个 1 都做深度优先搜索
for(int i=0; i<rows; ++i){
for(int j=0; j<cols; j++){
if(grid[i][j] == '1'){
//发现一个岛屿
++ count;
//将该 1 相连的 1 全部置为 0
dfs(grid, i, j);
}
}
}
return count;
}

private void dfs(char[][] grid, int r, int c){
int rows = grid.length;
int cols = grid[0].length;
//将第 r 行,第 c 列的 1 相邻的 1 全部置为 0
grid[r][c] = '0';
if(r-1 >= 0 && grid[r-1][c] == '1') dfs(grid, r-1, c);
if(r+1 <rows && grid[r+1][c] == '1') dfs(grid, r+1, c);
if(c-1 >= 0 && grid[r][c-1] == '1')dfs(grid, r, c-1);
if(c+1 < cols && grid[r][c+1] == '1')dfs(grid, r, c+1);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Solution {
public int numIslands(char[][] grid) {
int rows = grid.length;
if(rows == 0) return 0;
int cols = grid[0].length;
int count = 0;

for(int i=0; i<rows; ++i){
for(int j=0; j<cols; j++){
if(grid[i][j] == '1'){
//发现一个岛屿
grid[i][j] = '0';
++count;

Queue<Integer> neighbors = new LinkedList<>();
neighbors.add(i*cols+j);
//BFS
while(! neighbors.isEmpty()){
//得到保存的行列信息
int id = neighbors.remove();
int r = id / cols;
int c = id % cols;

//将第 i 行,第 j 列的 1 相邻的 1 全部置为 0
if(r-1 >= 0 && grid[r-1][c] == '1'){
neighbors.add((r-1)*cols+c);
grid[r-1][c] = '0';
}
if(r+1 <rows && grid[r+1][c] == '1'){
neighbors.add((r+1)*cols+c);
grid[r+1][c] = '0';
}
if(c-1 >= 0 && grid[r][c-1] == '1'){
neighbors.add(r*cols + c - 1);
grid[r][c-1] = '0';
}
if(c+1 < cols && grid[r][c+1] == '1'){
neighbors.add(r*cols + c + 1);
grid[r][c+1] = '0';
}
}
}
}
}
return count;
}
}