1. 岛屿问题算法解析:从DFS到BFS的实战指南
在算法竞赛和编程面试中,岛屿类问题(Island Problems)是图论中的经典题型,也是检验搜索算法掌握程度的试金石。这类问题通常给定一个由'0'(水域)和'1'(陆地)组成的二维网格地图,要求统计岛屿数量、计算最大岛屿面积或解决其他与连通区域相关的问题。本文将深入剖析两种核心解法——深度优先搜索(DFS)和广度优先搜索(BFS),并分享实际编码中的优化技巧和避坑经验。
1.1 问题定义与建模
岛屿问题的核心在于识别二维网格中的连通区域。在标准的计数孤岛问题中:
- 相邻的'1'(上下左右方向)组成一个岛屿
- 单独的'1'也算作一个岛屿
- 需要统计地图中独立岛屿的总数
例如对于如下3x3网格:
code复制1 1 0
0 1 0
0 0 1
应返回岛屿数量2(左上角4个'1'组成一个岛屿,右下角1个'1'是独立岛屿)
1.2 算法选择考量
DFS和BFS是解决这类连通性问题的两大核心策略:
- DFS:递归实现简洁,适合快速原型开发,但存在栈溢出风险
- BFS:迭代实现更安全,适合大规模网格,需要队列辅助空间
- 时间复杂度:均为O(n×m),每个单元格最多被访问一次
- 空间复杂度:O(n×m)(存储访问标记)或O(min(n,m))(某些优化版本)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 深度优先搜索(DFS)实现详解
2.1 基础DFS实现
DFS的核心思想是"不撞南墙不回头"——从起点出发,沿一个方向深入探索,直到无法继续再回溯。以下是计数孤岛的Java实现关键点:
java复制public static void dfs(int[][] graph, boolean[][] visited, int x, int y) {
// 终止条件:越界、已访问或遇到水域
if (x < 0 || x >= graph.length || y < 0 || y >= graph[0].length
|| visited[x][y] || graph[x][y] == 0) {
return;
}
visited[x][y] = true; // 标记当前单元格为已访问
