news 2026/8/10 3:24:03

LeetCode岛屿数量问题:DFS/BFS/并查集解法详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode岛屿数量问题:DFS/BFS/并查集解法详解

1. 问题概述与核心思路

LeetCode 200题"岛屿数量"是算法面试中的经典问题,主要考察图的遍历和连通域分析能力。题目给定一个由'1'(陆地)和'0'(水)组成的二维网格,要求计算其中岛屿的数量。岛屿被定义为水平或垂直方向上相邻的陆地组成的区域。

这个问题的关键在于理解"相邻"的定义——只有上下左右四个方向的连接才算相邻,对角线方向的连接不被考虑。例如在以下3x3网格中:

1 1 0 0 1 0 0 0 1

存在两个岛屿:左上角的3个'1'组成一个岛屿,右下角的单个'1'是另一个岛屿。

2. 解法分析与实现细节

2.1 深度优先搜索(DFS)解法

DFS是最直观的解决方法,时间复杂度O(M×N),空间复杂度O(M×N)(最坏情况下递归栈的深度):

def numIslands(grid): if not grid: return 0 count = 0 rows, cols = len(grid), len(grid[0]) def dfs(r, c): if r < 0 or c < 0 or r >= rows or c >= cols or grid[r][c] != '1': return grid[r][c] = '0' # 标记为已访问 dfs(r+1, c) dfs(r-1, c) dfs(r, c+1) dfs(r, c-1) for r in range(rows): for c in range(cols): if grid[r][c] == '1': count += 1 dfs(r, c) return count

注意:这里直接修改了输入网格,如果不允许修改原数组,需要额外使用visited矩阵记录访问状态。

2.2 广度优先搜索(BFS)解法

BFS使用队列实现,同样时间复杂度O(M×N),空间复杂度O(min(M,N)):

from collections import deque def numIslands(grid): if not grid: return 0 count = 0 rows, cols = len(grid), len(grid[0]) for r in range(rows): for c in range(cols): if grid[r][c] == '1': count += 1 queue = deque([(r, c)]) grid[r][c] = '0' while queue: row, col = queue.popleft() for dr, dc in [(-1,0),(1,0),(0,-1),(0,1)]: nr, nc = row + dr, col + dc if 0 <= nr < rows and 0 <= nc < cols and grid[nr][nc] == '1': queue.append((nr, nc)) grid[nr][nc] = '0' return count

2.3 并查集(Union-Find)解法

并查集适合处理动态连通性问题,时间复杂度O(M×N×α(M×N)),其中α是反阿克曼函数:

class UnionFind: def __init__(self, grid): rows, cols = len(grid), len(grid[0]) self.count = 0 self.parent = [i for i in range(rows * cols)] self.rank = [0] * (rows * cols) for r in range(rows): for c in range(cols): if grid[r][c] == '1': self.count += 1 def find(self, i): if self.parent[i] != i: self.parent[i] = self.find(self.parent[i]) return self.parent[i] def union(self, x, y): rootx = self.find(x) rooty = self.find(y) if rootx != rooty: if self.rank[rootx] > self.rank[rooty]: self.parent[rooty] = rootx else: self.parent[rootx] = rooty if self.rank[rootx] == self.rank[rooty]: self.rank[rooty] += 1 self.count -= 1 def numIslands(grid): if not grid: return 0 rows, cols = len(grid), len(grid[0]) uf = UnionFind(grid) for r in range(rows): for c in range(cols): if grid[r][c] == '1': grid[r][c] = '0' for dr, dc in [(-1,0),(1,0),(0,-1),(0,1)]: nr, nc = r + dr, c + dc if 0 <= nr < rows and 0 <= nc < cols and grid[nr][nc] == '1': uf.union(r * cols + c, nr * cols + nc) return uf.count

3. 算法优化与变种问题

3.1 空间复杂度优化

对于DFS/BFS解法,可以通过以下方式优化空间:

  1. 使用原矩阵标记访问状态(如将'1'改为'0')
  2. 使用位运算压缩状态信息
  3. BFS中使用双端队列优化

3.2 常见变种问题

  1. 统计岛屿的最大面积
  2. 统计封闭岛屿数量(岛屿不接触网格边缘)
  3. 统计不同形状岛屿的数量
  4. 允许对角线连接的岛屿数量统计
  5. 动态岛屿问题(网格会随时间变化)

4. 面试技巧与注意事项

  1. 明确问题边界条件:

    • 空网格处理
    • 全'0'或全'1'的情况
    • 网格只有一行或一列的情况
  2. 代码实现细节:

    • 使用方向数组简化相邻节点访问
    • 避免重复创建临时变量
    • 注意Python中列表的浅拷贝问题
  3. 复杂度分析要点:

    • 每个节点最多被访问一次
    • 递归深度的影响因素
    • 并查集路径压缩的效率
  4. 测试用例设计:

test_cases = [ ([], 0), # 空网格 ([["0"]], 0), # 单个水单元格 ([["1"]], 1), # 单个陆地单元格 ([["1","1","1"],["0","0","0"],["1","1","1"]], 2), # 两行岛屿 ([["1","0","1"],["0","1","0"],["1","0","1"]], 5) # 对角线岛屿 ]

5. 实际应用场景

岛屿数量问题不仅是算法题,在以下领域有实际应用:

  1. 图像处理中的连通区域分析
  2. 地图服务中的地块划分
  3. 电路板上的元件分组
  4. 社交网络中的社群发现
  5. 医学影像中的病灶区域识别

理解这类问题的解法有助于处理更复杂的实际场景,比如:

  • 动态变化的网格环境
  • 三维空间的连通域分析
  • 带权重的区域划分问题
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/10 3:23:55

EasyBIM给排水系统图智能生成:从三维模型到二维图纸的高效工作流

如果你是一名给排水工程师或BIM建模师&#xff0c;是否曾为绘制一张清晰、准确、符合规范的给排水系统图而头疼&#xff1f;传统CAD绘图方式下&#xff0c;系统图绘制往往意味着大量的重复劳动、繁琐的图层管理以及难以避免的人为错误。当设计变更时&#xff0c;牵一发而动全身…

作者头像 李华
网站建设 2026/8/10 3:23:29

分布式能源博弈:Matlab实现多产消者非合作博弈能量共享

1. 项目概述&#xff1a;分布式能源博弈的破局之道在微电网和分布式能源系统蓬勃发展的当下&#xff0c;我最近完成了一个极具挑战性的课题——多产消者&#xff08;prosumer&#xff09;非合作博弈能量共享系统的Matlab实现。这个项目源于当前能源领域的一个核心痛点&#xff…

作者头像 李华
网站建设 2026/8/10 3:22:20

在南京搞行业网站建设不能只拼颜值,更得拼转化率和信任感

说实话,在南京混互联网圈这几年,我看太多老板花大几十万做一个网站,结果上线第一天就在角落吃灰了。这日子我太熟了,毕竟我自己也从最初那个只想着“做得好看点”的小白,变成了现在满脑子都是“怎么让客户点开联系我们的按钮”的老兵。今天不跟你们扯那些虚头巴脑的技术名…

作者头像 李华
网站建设 2026/8/10 3:22:22

Vibe Coding:从意图到代码的范式变革与工程实践

你有没有过这样的经历&#xff1a;面对一个看似简单的功能需求&#xff0c;比如一个动态的角球战术板&#xff0c;你脑子里已经有了清晰的交互逻辑和视觉动效&#xff0c;但真正动手时&#xff0c;却发现要写一堆重复的、样板式的代码——状态管理、事件绑定、DOM操作、样式更新…

作者头像 李华
网站建设 2026/8/10 3:22:02

Agent推理速度优化:流式输出、并行调用与缓存策略实战

引言:Agent推理的“速度瓶颈”时代 2026年,我们正站在AI Agent从“能用”迈向“好用”的关键转折点上。大语言模型(LLM)的推理能力在过去18个月内提升了约3.2个数量级(根据Epoch AI 2026年Q2报告),但Agent系统的端到端响应延迟却仅改善了不到40%。这组数据的反差揭示了…

作者头像 李华
网站建设 2026/8/10 3:13:57

拒绝套路:一家靠谱的佛山外贸网站建设公司如何帮传统制造企业出海掘金

在佛山这片热土上,做工厂的朋友大概都有个共同的焦虑。咱们手里有绝活,车间里有轰鸣声,产品质量在业内那是没得挑,甚至很多还是细分领域的隐形冠军。但是,一谈到把产品卖给外国人,不少老板就开始挠头。以前靠展会、靠老客户的转介绍,日子也能过得滋润。可这两年,订单越…

作者头像 李华