图论

岛屿数量

中等#200Java时间 O(mn)空间 O(mn),最坏递归深度

题目要做什么

网格中 1 为陆地,0 为水。上下左右相连的陆地属于同一岛屿,求岛屿数量。Java 参数是字符矩阵,动画输入使用数字矩阵。

题目示例输入matrix = [[1,1,0,0],[1,0,0,1],[0,0,1,1]]
题目示例输出2

01 为什么这样做

扫描到未访问陆地时增加一个岛屿,然后用 DFS 将整片相连陆地改为 0。以后再扫描到这些格子时不会重复计数。

始终成立的条件

已经发现的岛屿全部标记为水;每个新 1 都代表尚未计数的连通分量。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public int numIslands(char[][] grid) {3        int count = 0;4        for (int r = 0; r < grid.length; r++) {5            for (int c = 0; c < grid[0].length; c++) {6                if (grid[r][c] == '1') {7                    count++;8                    sink(grid, r, c);9                }10            }11        }12        return count;13    }14    private void sink(char[][] grid, int r, int c) {15        if (r < 0 || c < 0 || r >= grid.length || c >= grid[0].length16                || grid[r][c] != '1') return;17        grid[r][c] = '0';18        sink(grid, r - 1, c);19        sink(grid, r + 1, c);20        sink(grid, r, c - 1);21        sink(grid, r, c + 1);22    }23}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索