51.岛屿数量

79 阅读1分钟

题目链接

给你一个由 '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)