第8章|图与并查集
Unit 03 · LeetCode #200 岛屿数量
仅本次页面有效
U03
Outer Scan + Component SearchDiscover Start → Flood One Island → Resume Scan
一块陆地不是一座岛,
一次完整搜索才对应一个连通分量。
Unit 02 已经学会从给定起点扩散一个区域。本单元增加外层扫描:只有扫描到“尚未被任何搜索覆盖的陆地”时,岛屿数才加一;随后必须先淹没整座岛,再恢复扫描。
检测到上次学习现场阶段、案例、动画步、问题、槽位、迁移脚手架、代码高度与滚动位置均可恢复。
LeetCode #200 · 岛屿数量
给定一个由字符 '1'(陆地)和 '0'(水)组成的 m × n 二维网格,返回岛屿数量。岛屿由水平或垂直相邻的陆地组成,网格四周视为被水包围。
示例 1
[["1","1","1","1","0"],
["1","1","0","1","0"],
["1","1","0","0","0"],
["0","0","0","0","0"]]
输出:1
示例 2
[["1","1","0","0","0"],
["1","1","0","0","0"],
["0","0","1","0","0"],
["0","0","0","1","1"]]
输出:3
约束与 Python 签名
m == grid.length
n == grid[i].length
1 ≤ m, n ≤ 300
grid[i][j] 为 '0' 或 '1'
class Solution:
def numIslands(self, grid):
...
本实验采用 BFS,并原地把已发现陆地改为 '0',从而复用网格作为访问状态。
扫描指针
按行检查所有坐标,负责寻找尚未归属任何岛屿的陆地起点。
queue
当前岛屿中已经发现、已经标记,但尚未展开四个邻居的格子。
islands
已经启动并完成或正在完成的连通分量搜索次数,而不是已访问陆地格子数。
Connected Component
任意两点之间存在路径,且与外部其他节点不连通的一组节点。
Outer Scan
一次搜索只能覆盖一个分量,因此需要扫描所有格子以发现其他起点。
Mark on Enqueue
陆地入队前立即标成水,防止同一格子被多个邻居重复入队。
Four-directional
只允许上下左右连接;对角线接触不属于同一座岛。
连通分量实验步骤 1
第八章 Unit 03 · Skill 卡
连通分量计数 = 外层发现起点 + 内层完整覆盖分量。只有尚未访问的陆地才能启动新搜索并令答案加一;同一岛屿中的后续陆地会在搜索中被提前标记,因此外层扫描再次遇到时不会重复计数。
Graph Model陆地格子是节点,四方向同为陆地时存在边
Outer Loop扫描所有坐标,发现每个新分量
Inner Search一次 BFS 完整淹没一座岛
Count搜索启动次数等于岛屿数量
Visited入队前把 '1' 改为 '0'
Complexity时间 O(mn),队列空间最坏 O(mn)
完成后停留在当前页面
不会倒计时或自动跳题。可以返回任意阶段重播扫描与扩散,或继续调整迁移代码。