1、题目描述
2、题目分析
为了求出岛屿的数量,扫描整个二维网格。如果一个位置为 1,则以其为起始节点开始进行深度优先搜索。在深度优先搜索的过程中,【每个搜索到的 1 都会被重新标记为 0】。
最终岛屿的数量就是我们进行深度优先搜索的次数。
下面的动画展示了整个算法。
class Solution {
int numIsland = 0;
public int numIslands(char[][] grid) {
int row = grid.length;
int col = grid[0].length;
for(int i = 0; i < row ; i++){
for(int j = 0; j < col; j++ ){
if(grid[i][j]=='1'){
numIsland++;
dfs(grid, i, j);
}
}
}
return numIsland;
}
private void dfs(char[][] grid, int i, int j){
// 需要先根据0判断,然后再判断大边界
if( i < 0 || j < 0 || i > grid.length - 1 || j > grid[0].length -1 )
return;
if(grid[i][j]=='1'){
grid[i][j]='0';
//向4面扩张
dfs(grid, i+1, j);
dfs(grid, i-1, j);
dfs(grid, i, j+1);
dfs(grid, i, j-1);
}
}
}
复杂度分析
时间复杂度:O(MN),其中 M 和 N 分别为行数和列数。
空间复杂度:O(MN),在最坏情况下,整个网格均为陆地,深度优先搜索的深度达到 M N。