Algorithms first

岛屿数量 · 交互式算法学习

计算由上下左右相连陆地组成的岛屿数量。

#200 ·

岛屿数量

Number of Islands

测试用例grid = [["1","1","0"],["1","0","0"],["0","0","1"]]
矩阵7 个关键状态
步骤 1发现第一座岛,把起点 (0,0) 改为 0 并入队。g[0][0]=0, count=1
00,0
10,1
00,2
11,0
01,1
01,2
02,0
02,1
12,2
islands1queue[(0,0)]
推荐

BFS 队列

时间 O(mn)空间 O(mn)

每发现新岛就用队列逐层访问其所有陆地。

1function numIslands(g) {2  let n = 0;3  for (let r = 0; r < g.length; r++)4    for (let c = 0; c < g[0].length; c++)5      if (g[r][c] === '1') {6        n++;7        const q = [8          [r, c]9        ];10        g[r][c] = '0';11        while (q.length) {12          const [x, y] = q.shift();13          for (const [a, b] of [14              [x + 1, y],15              [x - 1, y],16              [x, y + 1],17              [x, y - 1]18            ])19            if (g[a]?.[b] === '1') {20              g[a][b] = '0';21              q.push([a, b])22            }23        }24      } return n;25}
多语言参考

Java · C++ · Go

来源 · CC BY-SA 4.0 ↗

这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。

1class Solution {2    private char[][] grid;3    private int m;4    private int n;5 6    public int numIslands(char[][] grid) {7        m = grid.length;8        n = grid[0].length;9        this.grid = grid;10        int ans = 0;11        for (int i = 0; i < m; ++i) {12            for (int j = 0; j < n; ++j) {13                if (grid[i][j] == '1') {14                    dfs(i, j);15                    ++ans;16                }17            }18        }19        return ans;20    }21 22    private void dfs(int i, int j) {23        grid[i][j] = '0';24        int[] dirs = {-1, 0, 1, 0, -1};25        for (int k = 0; k < 4; ++k) {26            int x = i + dirs[k];27            int y = j + dirs[k + 1];28            if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1') {29                dfs(x, y);30            }31        }32    }33}
交互式算法学习

从执行步骤真正理解 LeetCode 经典 150

本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。

多形态可视化数组、矩阵、DP 表、递归树、树图、链表、栈队列堆、区间和状态机按解法选择。
动画与代码同步当前状态、步骤说明、变量和代码高亮保持一一对应,可逐步播放和回退。
适合面试复习每种方案都给出思路、时间复杂度、空间复杂度、测试用例和 LeetCode 中文原题入口。
AlgoViz Lab

岛屿数量 · 解法对比

计算由上下左右相连陆地组成的岛屿数量。

测试用例
grid = [["1","1","0"],["1","0","0"],["0","0","1"]]
题目分类
解法对比
2
方案 1

DFS 洪泛填充

遇到未访问陆地就计数,并递归淹没整座岛。

时间
O(mn)
空间
O(mn)
方案 2

BFS 队列

每发现新岛就用队列逐层访问其所有陆地。

时间
O(mn)
空间
O(mn)