给你一个由
'1'(陆地)和'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
解法 dfs+沉没岛屿
思路
计算岛屿的数量,本质上就是看当前位置上的 1 上下左右是否有数字 1 ,如果没有,则这是一块岛屿,反之则视为一整块。
我们换个角度,先从遍历开始,如果当前位置是 1 ,那把该位置上的数字设为 0 ,可以想象成把这块岛屿给沉没;然后递归地去寻找它的上下左右,如果找到了,说明是相连的,那么这应该视为一整块岛屿,相同地把这个位置上的数字设为0 。直到遍历完所有的岛屿。
其实沉没已经访问的岛屿是为了避免陷入死循环,也可以额外的一个二维布尔数组来去记录当前岛屿是否被访问过。
代码
function numIslands(grid: string[][]): number {
let result = 0;
const m = grid.length;
const n = grid[0].length;
const dfs = (r, c) => {
if (r < 0 || c < 0 || r >= m || c >= n || grid[r][c] === '0') return;
grid[r][c] = '0';
dfs(r + 1, c);
dfs(r - 1, c);
dfs(r, c + 1);
dfs(r, c - 1);
};
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (grid[i][j] === '1') {
result++;
dfs(i, j);
}
}
}
return result;
};
时空复杂度
时间复杂度:O(mn)
空间复杂度:额外堆栈空间 O(D) 最大岛屿的格子数量,最坏情况也能达到 O(mn),如果是二维布尔数组的话是 O(mn)