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

发布时间:2026/9/29 10:49:13

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/9/29 10:48:58

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

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

2026/9/28 11:01:48

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

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

2026/9/24 0:16:09

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

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

2026/9/29 10:44:38

Spring Boot校企合作信息管理平台毕业设计实战解析

又到了毕业设计的最忙阶段,后台陆续收到不少同学的问题,十个里有八个都在问同一个方向:"老师,Spring Boot项目到底选什么题目好上手?"今天就把我实际带过的、也是每年都要被问很多次的"校企合作信息管理…

2026/9/29 10:44:38

Docker下Alist配置SSL证书:Nginx反代实战与常见坑

最近捣鼓Docker部署的Alist时,最折腾人的一件事就是HTTPS证书。浏览器地址栏那个“不安全”的红色警告,对于自建网盘、影视库或者给朋友分享文件的人来说,实在是碍眼。更麻烦的是,直接用Docker跑的Alist,你在后台界面里…

2026/9/28 3:03:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/28 6:05:15

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 7:00:49

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 0:04:04

AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

1. 为什么AI Evals值得你花时间搞明白做LLM应用的人,迟早会撞上同一堵墙:模型输出飘忽不定,今天答得好好的,明天换个问法就胡说八道。你改了一版提示词,感觉好像好了点,但到底好了多少?说不清。…

2026/9/29 0:04:04

Java采购管理系统实战:从数据库设计到事务一致性

简介:这是一套面向Java Web初学者与课程设计者的采购管理系统完整源码,采用JSP技术搭建,配合MySQL数据库,用于解决企业采购信息的管理问题,适合作为毕业设计、课程大作业或进销存类项目的参考模板。系统实现了用户登录…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/29 9:46:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/29 6:36:14

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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