【LeetCode】200. 岛屿数量
解题思路
岛屿数量问题要求在由 '0'(水)和 '1'(陆地)组成的二维网格中,统计被水包围的岛屿数量。岛屿定义为水平或垂直方向相邻的陆地连接形成的区域。核心解决思路是深度优先搜索(DFS):
- 遍历扫描:遍历网格每个单元格
- 陆地触发:遇到陆地('1')时启动DFS
- 岛屿标记:DFS将当前岛屿所有陆地标记为水('0'),避免重复计数
- 计数递增:每次DFS启动表示发现新岛屿,计数器+1
该算法属于Flood Fill(泛洪算法),通过DFS"淹没"已发现的岛屿
关键步骤
- 网格遍历:双重循环遍历每个单元格
- 陆地检测:当
grid[i][j] == '1'
时:- 岛屿计数器+1
- 启动DFS淹没当前岛屿
- DFS淹没过程:
- 检查边界:若越界或已是水则返回
- 标记当前:将陆地改为水('1'→'0')
- 递归访问:上、下、左、右四个方向
- 方向处理:使用方向偏移量简化代码(非必需但更优雅)
代码实现
示例测试
复杂度分析
指标 | 值 | 说明 |
---|---|---|
时间复杂度 | O(m×n) | 每个单元格最多访问1次(m=行数,n=列数) |
空间复杂度 | O(m×n) | DFS递归栈深度最坏情况下达m×n(全陆地网格) |
关键点总结
-
DFS淹没机制:
- 通过递归将相连陆地标记为水
- 确保每个岛屿只计数一次
-
原地修改优化:
- 直接修改输入网格,避免额外空间
- 将访问过的陆地改为'0'作为标记
-
方向处理技巧:
- 显式写出四个方向(上、下、左、右)
- 替代方案:使用方向数组
dirs = [][2]int{{-1,0}, {1,0}, {0,-1}, {0,1}}
-
边界检查顺序:
- 先检查越界再访问网格
- 避免数组越界崩溃