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

发布时间:2026/11/15 22:10:50

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(r1, c) dfs(r-1, c) dfs(r, c1) 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 count2.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.count3. 算法优化与变种问题3.1 空间复杂度优化对于DFS/BFS解法可以通过以下方式优化空间使用原矩阵标记访问状态如将1改为0使用位运算压缩状态信息BFS中使用双端队列优化3.2 常见变种问题统计岛屿的最大面积统计封闭岛屿数量岛屿不接触网格边缘统计不同形状岛屿的数量允许对角线连接的岛屿数量统计动态岛屿问题网格会随时间变化4. 面试技巧与注意事项明确问题边界条件空网格处理全0或全1的情况网格只有一行或一列的情况代码实现细节使用方向数组简化相邻节点访问避免重复创建临时变量注意Python中列表的浅拷贝问题复杂度分析要点每个节点最多被访问一次递归深度的影响因素并查集路径压缩的效率测试用例设计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. 实际应用场景岛屿数量问题不仅是算法题在以下领域有实际应用图像处理中的连通区域分析地图服务中的地块划分电路板上的元件分组社交网络中的社群发现医学影像中的病灶区域识别理解这类问题的解法有助于处理更复杂的实际场景比如动态变化的网格环境三维空间的连通域分析带权重的区域划分问题
延伸阅读

更多相关文章

2026/11/6 4:19:50

Linux磁盘空间管理:du命令实战技巧与原理

1. Linux文件统计利器:du命令深度解析在Linux系统管理中,磁盘空间管理是每个运维人员和开发者必须掌握的基础技能。当你的服务器突然报警磁盘空间不足,或者需要清理老旧日志文件时,快速准确地定位"磁盘大户"就显得尤为重…

2026/11/9 0:36:24

3分钟搞定音乐识别:ShazamAPI让你轻松识别任何歌曲

3分钟搞定音乐识别:ShazamAPI让你轻松识别任何歌曲 【免费下载链接】ShazamAPI Fully reverse engeenired shazam api 项目地址: https://gitcode.com/gh_mirrors/sh/ShazamAPI 你听过一首好听的歌却不知道歌名?想为视频配乐却找不到合适的音乐信…

2026/11/13 14:04:55

VMware Workstation Pro 2026 本地安装与虚拟机创建全流程指南

这次我们来看 VMware Workstation Pro 2026 版本的本地安装与使用。对于需要在单台物理机上运行多个操作系统进行开发、测试或学习的用户来说,VMware 依然是功能最全面、性能最稳定的桌面虚拟化方案之一。新版本通常会带来更好的兼容性、性能优化以及对最新宿主和客…

2026/11/15 22:03:11

电工证天花板外省证能转吗电子证书怎么查

电工证天花板外省证能转吗电子证书怎么查 之前考的证在外省能不能转过来?这个问题,我见过太多人问。其实答案是肯定的,但关键要看你手上的是 电子证书 ,还是旧版纸质证书。尤其是现在应急管理部统一推行 电子证书…

2026/11/15 22:03:11

电工安全施工作业方案通过率揭秘:开封建筑工人如何避开培训陷阱

电工安全施工作业方案通过率揭秘:开封建筑工人如何避开培训陷阱 怕考不过白交培训费?别慌,电工安全施工作业方案考试没那么难,关键是要找对方法和培训机构。今天咱们就聊聊,像你这样的开封建筑工人,怎么在考电工证的路上少走弯路、稳稳拿到证书。…

2026/11/15 22:03:11

个人电工证在哪里挂着保姆级教程:急需特种作业证才能上岗找工作

个人电工证在哪里挂着保姆级教程:急需特种作业证才能上岗找工作 你是不是正在找工作,却因为手里没有电工证而被拒之门外?是不是在工地、水电站、建筑公司到处碰壁,就是因为手里没有合规的特种作业证?别急,今天这篇 保姆级教程 ,就是为像你这样…

2026/11/15 22:03:11

南职电工证培训地点在哪里?上岗必备证书过期别慌

南职电工证培训地点在哪里?上岗必备证书过期别慌 证书过期了不知道怎么复审延期?别慌,先搞清楚你手上的【南职电工证培训地点】到底在哪儿,再看看怎么把【上岗必备】的电工证重新激活。这玩意儿可不只是个纸片,是你找工作的“敲门砖”,更是你薪资涨不涨…

2026/11/15 22:03:11

特种工考试备考怎么过?电子证书时代实操挂科不再怕

特种工考试备考怎么过?电子证书时代实操挂科不再怕 实操考试心里没底怕挂科?这是几乎所有特种作业操作证考生的共同焦虑。尤其是在电子证书全面推行后,考试流程、证书效力、复审规则都发生了变化。如果你正准备报考电工、焊工、高处作业等特种工考试,这篇…

2026/11/15 21:58:10

电工证年检逾期怎么处理?多久拿证才能恢复上岗资格

电工证年检逾期怎么处理?多久拿证才能恢复上岗资格 证书过期了不知道怎么复审延期?这种情况在南阳甚至全国范围内都不少见,尤其是电工证这类高需求特种作业证书,一旦错过年检时间,不仅影响工作,还可能面临违规操作的法律风险。很多人担心,逾期了还能不…

2026/11/15 0:02:49

电工证考试口诉怎么准备值不值得考

电工证考试口诉怎么准备值不值得考 实操考试心里没底怕挂科,这是大多数准备考电工证的人心里最真实的感受。尤其是面对【电工证考试口诉】环节,很多人不知道该怎么准备,甚至担心自己说不好就被淘汰。其实,只要掌握方法, 值不值得考…

2026/11/15 0:02:49

桑植县考电工证千万别踩坑!报名全流程教你避坑

桑植县考电工证千万别踩坑!报名全流程教你避坑 你是不是也遇到过这种情况:想考个电工证,但不知道从哪儿下手,怕被中介坑,怕花冤枉钱,更怕考了证还不能用?别急,这正是你该看这篇文章的原因。在桑植县考电工证,确实有很多人被坑过,但只要你知道流程、…

2026/11/15 0:02:49

电工证考试口诉怎么准备值不值得考

电工证考试口诉怎么准备值不值得考 实操考试心里没底怕挂科,这是大多数准备考电工证的人心里最真实的感受。尤其是面对【电工证考试口诉】环节,很多人不知道该怎么准备,甚至担心自己说不好就被淘汰。其实,只要掌握方法, 值不值得考…

2026/11/15 0:02:49

桑植县考电工证千万别踩坑!报名全流程教你避坑

桑植县考电工证千万别踩坑!报名全流程教你避坑 你是不是也遇到过这种情况:想考个电工证,但不知道从哪儿下手,怕被中介坑,怕花冤枉钱,更怕考了证还不能用?别急,这正是你该看这篇文章的原因。在桑植县考电工证,确实有很多人被坑过,但只要你知道流程、…

2026/11/15 4:46:37

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/15 2:06:31

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑