Day19-岛屿数量

YVTU

🔗 LeetCode 200 - Number of Islands

📌 题目描述

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的二维网格 grid,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向或垂直方向相邻的陆地连接而成。


🔍 示例

1
2
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 实现

1
2
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 实现

1
2
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)来解决?
  • 如果要求标出每个岛屿的坐标集,该如何修改算法?