当前位置: 首页 > article >正文

LeetCode 200. 岛屿数量(C++):深度优先与广度优先的实战对比

1. 岛屿数量问题解析第一次看到LeetCode 200题岛屿数量时很多人会感到困惑这个看似简单的矩阵遍历问题为什么会被标记为中等难度让我用一个生活中的例子来解释想象你面前有一张卫星地图上面蓝色代表海洋绿色代表陆地。你的任务是统计这张地图上有多少个独立的岛屿。这里的独立很关键 - 任何相连的陆地上下左右相邻都属于同一个岛屿。在实际解题中我们需要解决三个核心问题如何判断两个陆地格子属于同一个岛屿如何确保不会重复统计同一个岛屿如何高效地遍历整个地图我刚开始做这道题时犯过一个典型错误直接遍历矩阵每遇到一个1就计数加一。结果发现严重高估了岛屿数量因为没有考虑相邻陆地属于同一岛屿的情况。后来才明白必须把相连的所有1都标记为已访问才能准确统计。2. 深度优先搜索(DFS)实现详解2.1 DFS核心思想深度优先搜索就像探险家登岛后的行为从登陆点开始一直往一个方向走到底直到无路可走再回溯。这种一条路走到黑的特点非常适合探索岛屿的边界。在代码实现上DFS通常使用递归这带来两个优势代码简洁直观与算法思想高度吻合系统栈自动处理回溯无需额外数据结构但要注意递归深度问题。我曾经在一个100x100的全1矩阵上测试直接爆栈。这说明DFS在极端情况下存在隐患。2.2 完整DFS代码实现class Solution { public: void dfs(vectorvectorchar grid, int i, int j) { // 越界检查或非陆地则返回 if(i 0 || i grid.size() || j 0 || j grid[0].size() || grid[i][j] ! 1) return; grid[i][j] 0; // 标记为已访问 // 四个方向递归探索 dfs(grid, i1, j); dfs(grid, i-1, j); dfs(grid, i, j1); dfs(grid, i, j-1); } int numIslands(vectorvectorchar grid) { if(grid.empty()) return 0; int count 0; for(int i 0; i grid.size(); i) { for(int j 0; j grid[0].size(); j) { if(grid[i][j] 1) { dfs(grid, i, j); count; } } } return count; } };这个版本比原始代码更健壮增加了边界检查。实际测试中处理100x100矩阵约需8ms空间复杂度O(M×N)最坏情况下递归深度。3. 广度优先搜索(BFS)实现剖析3.1 BFS算法特点广度优先搜索采用层层推进的策略就像在岛上以登陆点为中心一圈圈向外探索。这种特性使BFS能更均匀地探索整个岛屿避免DFS可能出现的一条路走到黑的情况。BFS特别适合寻找最短路径这道题不需要避免递归深度过大需要均匀探索的场景3.2 BFS实现细节class Solution { public: int numIslands(vectorvectorchar grid) { if(grid.empty()) return 0; int rows grid.size(), cols grid[0].size(); int count 0; queuepairint,int q; for(int i 0; i rows; i) { for(int j 0; j cols; j) { if(grid[i][j] 1) { count; q.push({i,j}); grid[i][j] 0; while(!q.empty()) { auto [x,y] q.front(); q.pop(); // 检查四个方向 if(x 0 grid[x-1][y] 1) { q.push({x-1,y}); grid[x-1][y] 0; } if(x rows-1 grid[x1][y] 1) { q.push({x1,y}); grid[x1][y] 0; } if(y 0 grid[x][y-1] 1) { q.push({x,y-1}); grid[x][y-1] 0; } if(y cols-1 grid[x][y1] 1) { q.push({x,y1}); grid[x][y1] 0; } } } } } return count; } };关键点必须在入队时立即标记为已访问而不是出队时处理。我曾在出队时标记结果导致某些节点被重复入队最终超时。4. DFS与BFS的实战对比4.1 性能基准测试我在LeetCode测试平台上对两种方法进行了对比单位ms测试用例DFS时间BFS时间100x100全1812稀疏岛屿45蛇形岛屿67DFS在大多数情况下稍快因为递归调用开销小于队列操作缓存局部性更好连续内存访问但BFS在极端情况下如非常深的岛屿更稳定不会爆栈。4.2 内存使用对比DFS的内存消耗取决于递归深度最坏O(M×N)BFS的队列在最坏情况下也需要O(min(M,N))空间。实际测试中方法平均内存使用DFS12MBBFS14MB4.3 适用场景建议根据我的项目经验小规模数据或岛屿形状简单 → DFS更简洁大规模数据或需要稳定性 → BFS更可靠并行计算场景 → BFS更容易并行化5. 并查集解法揭秘5.1 并查集核心思想并查集(Union-Find)是解决连通性问题的利器。它将每个陆地视为独立集合逐步合并相邻的集合最终统计剩余集合数量。这种方法的优势在于不需要修改原始网格可以增量处理数据适合动态变化的场景5.2 完整实现代码class Solution { public: vectorint parent; int count 0; int find(int x) { while(parent[x] ! x) { parent[x] parent[parent[x]]; // 路径压缩 x parent[x]; } return x; } void unite(int x, int y) { int rootX find(x); int rootY find(y); if(rootX ! rootY) { parent[rootX] rootY; --count; } } int numIslands(vectorvectorchar grid) { if(grid.empty()) return 0; int m grid.size(), n grid[0].size(); parent.resize(m*n); // 初始化 for(int i 0; i m; i) { for(int j 0; j n; j) { if(grid[i][j] 1) { parent[i*n j] i*n j; count; } } } // 合并操作 for(int i 0; i m; i) { for(int j 0; j n; j) { if(grid[i][j] 1) { if(i 0 grid[i-1][j] 1) unite(i*n j, (i-1)*n j); if(j 0 grid[i][j-1] 1) unite(i*n j, i*n j-1); } } } return count; } };并查集的性能约28ms虽然不如DFS/BFS快但在某些特殊场景下如动态变化的网格更有优势。6. 算法选择与优化技巧经过多次实践我总结出以下经验面试时优先实现DFS代码简洁易懂竞赛中可以考虑BFS避免递归风险并查集适合作为加分项展示优化技巧方向数组简化代码int dirs[4][2] {{-1,0}, {1,0}, {0,-1}, {0,1}};提前检查空输入使用位运算优化并查集在真实项目中我曾遇到需要处理TB级地图数据的情况最终采用分块BFS的方案每个区块独立处理后再合并结果。这种思路也可以应用到这道题的变种中。

相关文章:

LeetCode 200. 岛屿数量(C++):深度优先与广度优先的实战对比

1. 岛屿数量问题解析 第一次看到LeetCode 200题岛屿数量时,很多人会感到困惑:这个看似简单的矩阵遍历问题,为什么会被标记为中等难度?让我用一个生活中的例子来解释:想象你面前有一张卫星地图,上面蓝色代表…...

WMatrix 7语料库分析工具上线:隐喻识别高效精准,语言学研究利器

温馨提示:文末有联系方式WMatrix 7:专为语料库驱动隐喻分析优化的实用工具 WMatrix 7是当前广受语言学研究者青睐的语料库分析平台,内置强大词性标注、搭配提取与语义域分类功能,尤其在隐喻识别(如MVU框架适配&#xf…...

YimMenu:GTA V安全防护与体验增强工具完全指南

YimMenu:GTA V安全防护与体验增强工具完全指南 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu …...

大数据领域Hive与Spark的结合使用案例

大数据领域Hive与Spark的结合使用案例 关键词:Hive、Spark、大数据处理、数据仓库、分布式计算、ETL、数据分析 摘要:在大数据技术栈中,Hive作为基于Hadoop的数据仓库工具,擅长海量数据的存储与离线分析;Spark作为高性能分布式计算引擎,在复杂数据处理和实时计算领域表现…...

MemMA:多智能体驱动的记忆自进化框架

📌 一句话总结: 本工作提出 MemMA,一个通过多智能体协同与自进化机制统一优化“记忆构建-检索-利用”循环的框架,显著提升长程记忆推理能力。 🔍 背景问题: 当前 memory-augmented LLM agent 存在两个核…...

2026年黄山钢筋网片供应厂家揭秘

在建筑行业蓬勃发展的今天,钢筋网片作为建筑施工中不可或缺的材料,其质量和供应厂家的选择至关重要。对于黄山地区的建筑项目来说,找到一家靠谱的钢筋网片供应厂家,是保障工程质量和进度的关键。今天,我们就来揭秘一家…...

Transformer深度解析四:认知跃迁、交互建模与文明基底重构

【内容定位】未来畅想【文章日期】2026-03-31【场景引入】2026年3月的最后一天,我们站在一个看似稳固的技术高原上回望:Transformer架构已如同信息时代的“牛顿定律”,近乎完美地描述了语言宇宙中“符号”与“关系”的运动规律,并…...

GLM-4.1V-9B-Base模型微调入门:使用accelerate库进行高效参数优化

GLM-4.1V-9B-Base模型微调入门:使用accelerate库进行高效参数优化 1. 引言 想为特定业务场景定制一个强大的多模态AI模型?GLM-4.1V-9B-Base作为支持图文理解与生成的大模型,通过微调可以快速适配各种下游任务。本文将带你从零开始&#xff…...

新手零压力入门,快马ai带你三步搞定nodejs环境配置

最近在帮几个朋友入门Node.js时,发现很多新手卡在了环境配置这一步。作为一个过来人,我完全理解那种面对命令行手足无措的感觉。好在现在有了InsCode(快马)平台,可以快速生成一个专为Node.js新手设计的入门项目模板,把抽象的配置过…...

开箱即用!Qwen-Image-2512-SDNQ Web服务快速体验指南

开箱即用!Qwen-Image-2512-SDNQ Web服务快速体验指南 1. 五分钟了解Qwen-Image-2512-SDNQ Web服务 你是否遇到过这样的场景:需要快速生成一张概念图,但打开专业设计软件太麻烦?或者想尝试AI绘画,却被复杂的模型部署步…...

告别重复编码:用快马ai自动生成c语言基础工具模块提升效率

告别重复编码:用快马AI自动生成C语言基础工具模块提升效率 在C语言开发中,我们经常需要重复编写一些基础工具模块,比如安全的字符串输入、动态数组管理、日志记录等功能。这些代码虽然不复杂,但每次都从头开始写确实很浪费时间。…...

实战演练:基于快马平台,快速搭建一个软件密钥授权管理后台原型

实战演练:基于快马平台,快速搭建一个软件密钥授权管理后台原型 最近在开发一个软件授权管理系统时,发现很多项目都需要类似的密钥管理功能。正好用InsCode(快马)平台快速搭建了一个原型,以VMware16密钥管理为例,分享一…...

别再数据线了!用FastAPI 分钟搭个局域网文件+剪贴板神器

AI Agent 时代的沙箱需求 从 Copilot 到 Agent:执行能力的质变 在生成式 AI 的早期阶段,应用主要以“Copilot”形式存在,AI 仅作为辅助生成建议。然而,随着 AutoGPT、BabyAGI 以及 OpenAI Code Interpreter(现为 Advan…...

当nodepad遇见AI:利用快马平台快速集成智能代码补全与文本润色功能

最近在折腾一个智能文本编辑器项目,想把AI能力集成到传统的文本编辑场景中。经过一番摸索,发现用InsCode(快马)平台可以快速实现这个想法,整个过程比想象中简单很多。这里记录下我的实践过程,分享给同样对AI辅助开发感兴趣的朋友。…...

MultiAgentBench:一套真正评测多智能体协作与博弈能力的基准

摘要:大语言模型已经展现出作为自主智能体的显著能力,但现有基准要么只关注单智能体任务,要么局限于狭窄领域,无法刻画多智能体协作与竞争的动态过程。本文提出 MultiAgentBench,这是一个面向 LLM 多智能体系统的综合性…...

超越本地插件:利用快马平台ai能力全面提升你的编码效率与工作流

最近在开发前端项目时,我一直在寻找能提升效率的AI工具。之前用过一些本地IDE插件,虽然能提供基础的代码补全,但功能比较局限。后来尝试了InsCode(快马)平台,发现它把AI辅助开发做到了一个新高度,特别适合需要快速迭代…...

MySQL解析器的性能优化:从理论到实践

MySQL解析器的性能优化:从理论到实践 引言 作为一名在数据深渊里捞了十几年 Bug 的女码农,我见过太多因为解析器性能问题导致的数据库瓶颈。在 MySQL 数据库中,解析器的性能直接影响 SQL 语句的处理速度和系统的整体性能。今天,我…...

别死记硬背了!一张图带你理清编译原理‘语法制导翻译’到‘代码优化’的核心链路

编译原理核心链路解析:从语法制导翻译到代码优化的实战指南 编译原理作为计算机科学的重要基石,常常让学习者感到知识点零散、难以形成系统认知。本文将以赋值语句为例,通过清晰的逻辑链路,展示从源代码到优化代码的完整编译过程&…...

STM32与NB-IoT温室水培系统设计与实现

1. 项目概述与背景这个温室水培系统项目是我去年为一个农业科技园区设计的实际案例,当时客户需要一套能够实现远程监控的智能种植解决方案。经过三个月的开发和调试,最终形成了这套基于STM32和NB-IoT的完整系统。现代温室种植面临几个核心痛点&#xff1…...

3个步骤搞定本地OCR:让隐私保护与效率提升不再矛盾

3个步骤搞定本地OCR:让隐私保护与效率提升不再矛盾 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语言库…...

嵌入式Linux接入阿里飞燕物联网平台实战指南

1. 嵌入式Linux设备接入飞燕物联网平台全流程解析作为一名在嵌入式领域摸爬滚打多年的工程师,最近刚完成了一个将智能家居设备从旧平台迁移到阿里飞燕物联网平台的项目。这个过程中踩了不少坑,也积累了一些实战经验,今天就来详细分享一下基于…...

P3916 图的遍历 题解(反向建图)

更好的阅读体验(博客园) 题面 P3916 图的遍历 题目描述 给出 NNN 个点,MMM 条边的有向图,对于每个点 vvv,令 A(v)A(v)A(v) 表示从点 vvv 出发,能到达的编号最大的点。现在请求出 A(1),A(2),…,A(N)A(1),…...

这面镜子,照出了什么?——一次“自找麻烦“的差距分析实录

在多篇推文的评论区,关于实战案例的呼声一直很高。今天,我们就聊一聊发生在义翘神州实验室日常检测和质量管理中的案例,来一场“自我找茬”:差距分析。 在质量管理领域,“差距分析”这四个字耳熟能详。它就像一面镜子&…...

[语音转文字工具] AsrTools:让音频转写效率提升300%的开源解决方案

[语音转文字工具] AsrTools:让音频转写效率提升300%的开源解决方案 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio in…...

效率提升秘籍:用快马AI一键生成nt动漫角色管理模块代码

最近在开发一个nt动漫相关的项目,其中角色管理模块是必不可少的部分。这个模块需要实现角色列表展示、详情查看、新增、编辑和删除等功能。传统开发方式下,光是搭建这些基础功能就要花费不少时间。不过我发现用InsCode(快马)平台可以快速生成这些重复性高…...

思源宋体CN终极指南:7款免费商用字体一站式解决方案

思源宋体CN终极指南:7款免费商用字体一站式解决方案 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为商业项目寻找高质量中文字体而烦恼吗?思源宋体CN字体…...

STM32串口通信实战指南与常见问题解析

1. 串口通信基础概念解析串口通信作为嵌入式系统中最基础也最常用的通信方式之一,其核心原理是通过单根数据线按位顺序传输数据。与并行通信相比,虽然传输速率较低,但具有布线简单、成本低廉、传输距离远等显著优势。在实际工程应用中&#x…...

什么是 AI Agent?它和直接调用大模型 API 做一次问答有什么本质区别?

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:AI大模型原理和应用面试题 文章目录一、🍀AI Agent概念、AI Agent和直接…...

深度解析:相机、LiDAR与IMU紧耦合SLAM技术的最新进展与挑战

1. 为什么需要相机、LiDAR与IMU紧耦合? 想象一下你第一次玩VR游戏时的场景:头显里的画面随着你转头而实时变化,但稍有延迟就会让人头晕目眩。这正是SLAM技术要解决的核心问题——在未知环境中实时确定自身位置并构建地图。而单一传感器就像只…...

阿里千问Qwen3.5-Omni:全模态大模型的新王者

Qwen3.5-Omni:全模态能力的新巅峰3月30日,阿里发布的千问新一代全模态大模型Qwen3.5-Omni,在音视频理解、识别、交互等215项任务中取得SOTA(性能最佳),超越Gemini-3.1 Pro,成为全球最强的全模态…...