题目
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
跳转链接:LeetCode200
解析
本题我们可以使用 DFS 或者 BFS 来解决。当我们遍历二位数组遇到 ‘1’ 时,我们可以通过 DFS 或者 BFS 将与本点相连的所有 ‘1’ 都标记出来,这样当遍历到被标记的 ‘1’ 时我们就不用将其记入新的岛屿数量。
public class Solution {
private char[][] grid;
//use用于标记该点是否属于被记录的岛屿的一部分
private boolean[][] use;
public int numIslands(char[][] grid) {
int n = grid.length, m = grid[0].length, ans = 0;
use = new boolean[n][m];
this.grid = grid;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
//如果这片土地被标记则代表他不是新岛屿
if(grid[i][j] == '1' && !use[i][j]){
ans++;
use[i][j] = true;
dfs(i, j, n, m);
}
}
}
return ans;
}
//DFS用于标记与当前岛屿相连的土地
private void dfs(int i, int j, int n, int m){
if (i + 1 < n && grid[i + 1][j] == '1' && !use[i + 1][j]){
use[i + 1][j] = true;
dfs(i + 1, j, n, m);
}
if (j + 1 < m && grid[i][j + 1] == '1' && !use[i][j + 1]){
use[i][j + 1] = true;
dfs(i, j + 1, n, m);
}
if (i - 1 >= 0 && grid[i - 1][j] == '1' && !use[i - 1][j]){
use[i - 1][j] = true;
dfs(i - 1, j, n, m);
}
if(j - 1 >= 0 && grid[i][j - 1] == '1' && !use[i][j - 1]){
use[i][j - 1] = true;
dfs(i, j - 1, n, m);
}
}
}
938

被折叠的 条评论
为什么被折叠?



