核心思路:
遍历每一个格子,遇到陆地就把它所在的整座岛全部淹掉(标记为 0),岛屿数量 +1
通俗解释
- 逐个格子扫一遍
- 碰到
1说明发现一座新岛 ,count++ - 立刻用 DFS 把这座岛所有相连的 1 都改成 0(相当于淹掉)
- 继续扫,直到结束
这样每座岛只会被计数一次
完整代码实现:
java
class Solution {
public int numIslands(char[][] grid) {
if(grid == null || grid.length == 0) return 0;
int count = 0;
int m = grid.length;
int n = grid[0].length;
for(int i = 0;i<m;i++){
for(int j = 0;j<n;j++){
// 找到一块陆地
if(grid[i][j] == '1'){
count++;
// 把这座岛全部淹掉
dfs(grid,i,j);
}
}
}
return count;
}
public void dfs(char[][] grid,int i,int j){
int m = grid.length;
int n = grid[0].length;
// 越界 或者 是水,直接返回
if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] == '0') {
return;
}
// 淹掉
grid[i][j] = '0';
dfs(grid,i - 1,j);
dfs(grid,i + 1,j);
dfs(grid,i,j - 1);
dfs(grid,i,j + 1);
}
}