🔗 LeetCode 200 - Number of Islands
📌 题目描述
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的二维网格 grid,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向或垂直方向相邻的陆地连接而成。
🔍 示例
| 12
 3
 4
 5
 6
 7
 8
 
 | 输入: grid = [
 ["1","1","0","0","0"],
 ["1","1","0","0","0"],
 ["0","0","1","0","0"],
 ["0","0","0","1","1"]
 ]
 输出: 3
 
 | 
💡 解题思路
经典的 深度优先搜索(DFS) 问题:
- 从每个未访问的 ‘1’ 出发进行 DFS,将连通的所有 ‘1’ 标记为 ‘0’;
- 每次遍历完整个岛屿,岛屿数量加 1;
- 或可使用 BFS、并查集进行拓展解法。
时间复杂度:O(m × n)
空间复杂度:O(m × n)
✅ JavaScript 实现
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 
 | var numIslands = function(grid) {let count = 0;
 const rows = grid.length, cols = grid[0].length;
 
 const dfs = (i, j) => {
 if (i < 0 || i >= rows || j < 0 || j >= cols || grid[i][j] === '0') return;
 grid[i][j] = '0';
 dfs(i + 1, j);
 dfs(i - 1, j);
 dfs(i, j + 1);
 dfs(i, j - 1);
 };
 
 for (let i = 0; i < rows; i++) {
 for (let j = 0; j < cols; j++) {
 if (grid[i][j] === '1') {
 dfs(i, j);
 count++;
 }
 }
 }
 return count;
 };
 
 | 
✅ Swift 实现
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 
 | func numIslands(_ grid: [[Character]]) -> Int {var grid = grid
 let rows = grid.count
 let cols = grid[0].count
 var count = 0
 
 func dfs(_ i: Int, _ j: Int) {
 if i < 0 || i >= rows || j < 0 || j >= cols || grid[i][j] == "0" {
 return
 }
 grid[i][j] = "0"
 dfs(i + 1, j)
 dfs(i - 1, j)
 dfs(i, j + 1)
 dfs(i, j - 1)
 }
 
 for i in 0..<rows {
 for j in 0..<cols {
 if grid[i][j] == "1" {
 dfs(i, j)
 count += 1
 }
 }
 }
 
 return count
 }
 
 | 
🧠 思考拓展
- 如何使用 BFS 实现?
- 如何使用并查集(Union-Find)来解决?
- 如果要求标出每个岛屿的坐标集,该如何修改算法?