LeetCode Hot 100 | 图论(C++ 题解)
LeetCode Hot 100 | 图论C 题解Hot100 图论200 / 994 / 207 / 208。目录LeetCode Hot 100 | 图论C 题解一、200. Number of Islands岛屿数量 中等题目描述图解解题思路C 代码二、994. Rotting Oranges腐烂的橘子 中等题目描述图解解题思路C 代码三、207. Course Schedule课程表 中等题目描述图解解题思路C 代码四、208. Implement Trie (Prefix Tree)实现 Trie 前缀树 中等题目描述图解解题思路C 代码总结一、200. Number of Islands岛屿数量 中等题目描述给你一个由1陆地和0水组成的二维网格请你计算网格中岛屿的数量。岛屿总是被水拦截并且每座岛屿只能由水平方向和/或垂直方向上相邻的陆地连接而成。示例 1输入grid [ [1,1,1,1,0], [1,1,0,1,0], [1,1,0,0,0], [0,0,0,0,0] ] 输出1示例 2输入grid [ [1,1,0,0,0], [1,1,0,0,0], [0,0,1,0,0], [0,0,0,1,1] ] 输出3图解解题思路DFS 染色本解遍历网格每遇到1就发起一次 DFS将该岛屿的所有格子标记为2已访问同时岛屿计数 1。DFS 的边界条件越界、非1时返回。通过标记2避免重复访问。举例示例 2(0,0) 是 1 → DFS 标记 (0,0),(0,1),(1,0),(1,1) 为 2ans1 (2,2) 是 1 → DFS 标记 (2,2)ans2 (3,3) 是 1 → DFS 标记 (3,3),(3,4)ans3 最终3 ✅代码亮点使用 C23 的this auto dfs语法实现 lambda 递归写法简洁。复杂度时间 O(m×n)空间 O(m×n)递归栈C 代码classSolution{public:intnumIslands(vectorvectorchargrid){introwSizegrid.size();intcolSizegrid[0].size();intans0;autodfs[](thisautodfs,introw,intcol)-void{if(row0||rowrowSize||col0||colcolSize||grid[row][col]!1)return;grid[row][col]2;dfs(row,col-1);dfs(row,col1);dfs(row1,col);dfs(row-1,col);};for(inti0;irowSize;i){for(intj0;jcolSize;j){if(grid[i][j]1){dfs(i,j);ans;}}}returnans;}};二、994. Rotting Oranges腐烂的橘子 中等题目描述在给定的m × n网格grid中每个单元格可以有以下三个值之一0代表空单元格1代表新鲜橘子2代表腐烂的橘子每分钟腐烂的橘子周围 4 个方向上相邻的新鲜橘子都会腐烂。返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能返回-1。示例 1输入grid [[2,1,1],[1,1,0],[0,1,1]] 输出4示例 2输入grid [[2,1,1],[0,1,1],[1,0,1]] 输出-1左下角的 1 无法被感染示例 3输入grid [[0,2]] 输出0没有新鲜橘子图解解题思路多源 BFS本解同时从所有腐烂橘子出发做 BFS每一轮 BFS 相当于过一分钟。初始化统计所有新鲜橘子数量fresh将所有腐烂橘子位置加入队列BFS 过程每轮弹出当前队列中的所有腐烂橘子扩散到相邻新鲜橘子将其标记为2并加入队列fresh--轮次ans。终止当fresh 0或队列为空时停止。若结束后fresh 0说明有橘子无法腐烂返回-1。举例示例 1初始fresh6queue{(0,0)} 第1轮(0,0)扩散→(0,1),(1,0)腐烂fresh4ans1 第2轮(0,1),(1,0)扩散→(0,2),(1,1)腐烂fresh2ans2 第3轮(0,2),(1,1)扩散→(2,1)腐烂fresh1ans3 第4轮(2,1)扩散→(2,2)腐烂fresh0ans4 fresh0返回 4 ✅复杂度时间 O(m×n)空间 O(m×n)C 代码classSolution{public:intorangesRotting(vectorvectorintgrid){intans0;introwSizegrid.size();intcolSizegrid[0].size();queuepairint,intq;intfresh0;for(inti0;irowSize;i){for(intj0;jcolSize;j){if(grid[i][j]1)fresh;elseif(grid[i][j]2)q.push(make_pair(i,j));}}vectorvectorintdir{{1,0},{-1,0},{0,-1},{0,1}};while(fresh!q.empty()){intsizeq.size();for(intj0;jsize;j){autoposq.front();q.pop();for(inti0;idir.size();i){intxpos.firstdir[i][0];intypos.seconddir[i][1];if(x0xrowSizey0ycolSizegrid[x][y]1){fresh--;grid[x][y]2;q.push(make_pair(x,y));}}}ans;}returnfresh?-1:ans;}};三、207. Course Schedule课程表 中等题目描述你这个学期必须选修numCourses门课程记为0到numCourses - 1。在选修某些课程之前需要一些先修课程。先修课程按数组prerequisites给出其中prerequisites[i] [ai, bi]表示如果要学习课程ai则必须先学习课程bi。请你判断是否可能完成所有课程的学习示例 1输入numCourses 2, prerequisites [[1,0]] 输出true先上0再上1示例 2输入numCourses 2, prerequisites [[1,0],[0,1]] 输出false循环依赖图解解题思路拓扑排序BFS Kahn 算法本解如果课程间存在循环依赖则无法完成所有课程等价于判断有向图是否存在环。用拓扑排序BFS 版本建图umap[a]存 a 的前驱inDegree[b]b 有入度将所有入度为 0 的节点入队计数countBFS每次出队一个节点将其所有前驱的入度 -1若入度变为 0 则入队count若count numCourses说明所有节点都被处理过无环注意代码中umap[prerequisites[i][0]].push_back(prerequisites[i][1])即a → b方向a 依赖 bb 是 a 的先修inDegree[b]计的是 b 被依赖的次数b 被解锁后才能减少依赖 b 的课程的入度。举例[[1,0],[0,1]]循环inDegree [1, 1]0和1互相依赖 没有入度为0的节点count0 ≠ 2 返回 false ✅复杂度时间 O(VE)空间 O(VE)C 代码classSolution{public:boolcanFinish(intnumCourses,vectorvectorintprerequisites){unordered_mapint,vectorintumap;vectorintinDegre(numCourses,0);intcount0;queueintq;for(inti0;iprerequisites.size();i){umap[prerequisites[i][0]].push_back(prerequisites[i][1]);inDegre[prerequisites[i][1]];}for(inti0;inumCourses;i){if(!inDegre[i]){q.push(i);count;}}while(!q.empty()){intcoursesq.front();q.pop();vectorintcoursumap[courses];for(autocour:cours){inDegre[cour]--;if(!inDegre[cour]){q.push(cour);count;}}}return(countnumCourses);}};四、208. Implement Trie (Prefix Tree)实现 Trie 前缀树 中等题目描述Trie发音类似 “try”或者说前缀树是一种树形数据结构用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景例如自动补全和拼写检查。请你实现 Trie 类Trie()初始化前缀树对象void insert(String word)向前缀树中插入字符串wordboolean search(String word)如果word在前缀树中返回trueboolean startsWith(String prefix)如果之前已插入的字符串中有以prefix为前缀的字符串返回true示例输入 [Trie, insert, search, search, startsWith, insert, search] [[], [apple], [apple], [app], [app], [app], [app]] 输出[null, null, true, false, true, null, true]图解解题思路哈希表 Trie 节点本解每个节点TreeNode包含unordered_mapchar, TreeNode* umap子节点映射bool isEnd标记是否为某个单词的结尾三个操作insert从 root 出发对每个字符若不存在则新建节点最后标记isEnd truesearch从 root 出发沿字符遍历若中途找不到字符返回 false走完后返回cur-isEndstartsWith与 search 相同但最后直接返回 true不需要 isEnd举例insert “apple” 后 search “app”insert apple: root→a→p→p→l→e(isEndtrue) search app: root→a→p→p → cur 存在 走完了cur-isEnd falsep 不是单词结尾 返回 false ✅ startsWith app: root→a→p→p → 走完返回 true ✅复杂度时间 O(L)L 为字符串长度空间 O(总字符数)C 代码classTrie{structTreeNode{unordered_mapchar,TreeNode*umap;boolisEnd;TreeNode(){umap.clear();isEndfalse;}};public:TreeNode*root;Trie(){rootnewTreeNode();}voidinsert(string word){TreeNode*curroot;for(autoc:word){if(!cur-umap.count(c)){cur-umap[c]newTreeNode();}curcur-umap[c];}cur-isEndtrue;}boolsearch(string word){TreeNode*curroot;for(autoc:word){if(!cur-umap.count(c))returnfalse;curcur-umap[c];}returncur-isEnd;}boolstartsWith(string prefix){TreeNode*curroot;for(autoc:prefix){if(!cur-umap.count(c))returnfalse;curcur-umap[c];}returntrue;}};/** * Your Trie object will be instantiated and called as such: * Trie* obj new Trie(); * obj-insert(word); * bool param_2 obj-search(word); * bool param_3 obj-startsWith(prefix); */总结题号题目难度核心思路时间复杂度空间复杂度200岛屿数量 中等DFS 染色标记 ‘2’O(m×n)O(m×n)994腐烂的橘子 中等多源 BFS逐轮扩散O(m×n)O(m×n)207课程表 中等拓扑排序Kahn BFS判断有无环O(VE)O(VE)208实现 Trie 中等哈希表 Trie 节点isEnd 标记词尾O(L)O(总字符)如果这篇文章对你有帮助欢迎点赞收藏 ⭐也欢迎在评论区交流

相关新闻

SolidWorks装配体边界获取技术解析与C#实现

SolidWorks装配体边界获取技术解析与C#实现

1. SolidWorks装配体边界获取技术解析 在机械设计领域,获取装配体的精确边界尺寸是进行空间规划、干涉检查和包装设计的基础工作。作为主流的三维CAD软件,SolidWorks提供了完善的API接口供开发者扩展功能。通过C#进行二次开发,我们可以实现自…

2026/10/4 22:23:18 阅读更多 →
免费足球数据分析终极指南:无需API密钥获取30+联赛完整数据

免费足球数据分析终极指南:无需API密钥获取30+联赛完整数据

免费足球数据分析终极指南:无需API密钥获取30联赛完整数据 【免费下载链接】football.json Free open public domain football data in JSON incl. English Premier League, Bundesliga, Primera Divisin, Serie A and more - No API key required ;-) 项目地址: …

2026/10/10 6:47:09 阅读更多 →
如何在Windows上为苹果触控板安装完美驱动:mac-precision-touchpad终极指南

如何在Windows上为苹果触控板安装完美驱动:mac-precision-touchpad终极指南

如何在Windows上为苹果触控板安装完美驱动:mac-precision-touchpad终极指南 【免费下载链接】mac-precision-touchpad Windows Precision Touchpad Driver Implementation for Apple MacBook / Magic Trackpad 项目地址: https://gitcode.com/gh_mirrors/ma/mac-p…

2026/10/4 15:52:43 阅读更多 →

最新新闻

Material Design 2.0底部工具栏动效设计:从原则到落地

Material Design 2.0底部工具栏动效设计:从原则到落地

在Material Design 2.0里,底部工具栏(Bottom Toolbar / Bottom App Bar)是最容易被低估的组件。它不占据屏幕视觉中心,却落在用户拇指最舒适的操作热区,承载着页面主操作、导航切换、上下文动作这些关键任务。而这块区…

2026/10/15 10:27:23 阅读更多 →
Volar 0.x 版本演进全解析:Vue Language Tools 的能力迭代与配置变迁

Volar 0.x 版本演进全解析:Vue Language Tools 的能力迭代与配置变迁

开发工具IDE语言服务 【免费下载链接】language-tools ⚡ High-performance Vue language tooling based-on Volar.js 项目地址: https://gitcode.com/gh_mirrors/la/language-tools 点击查看 免费下载 本篇技术指南以 Vue Language Tools(基于 Volar.j…

2026/10/15 10:27:23 阅读更多 →
从App到Unity:游戏开发认知地图与AI实践指南

从App到Unity:游戏开发认知地图与AI实践指南

1. 从 App 到 Unity:为什么越来越多人开始搭建这张认知地图做了几年移动端 App 开发的人,多少都会在某个时间点冒出一个念头:要不要试试游戏开发?这个念头可能来自一次玩到上头的独立游戏,可能来自公司业务向互动内容倾…

2026/10/15 10:27:23 阅读更多 →
在线图片处理系统源码:18款压缩转换编辑工具压缩、编辑、转换、拼图四大类电脑手机双端

在线图片处理系统源码:18款压缩转换编辑工具压缩、编辑、转换、拼图四大类电脑手机双端

在线图片处理工具 功能说明 一、整体介绍 这是一套在浏览器里直接使用的在线图片处理工具站,用户不需要安装任何软件:打开网页、上传图片、设置参数、在线处理、下载结果。目前提供 18 个图片处理工具和 1 个拼图工具,按用途分为图片压缩、图…

2026/10/15 10:27:23 阅读更多 →
泰勒公式:从粗糙规则到严谨理论,它如何撑起现代算法

泰勒公式:从粗糙规则到严谨理论,它如何撑起现代算法

泰勒公式大概是微积分教材里“最”字辈选手:最容易被误用,也最能检验你是不是真的理解极限。很多人背下展开式就以为自己会了,结果一遇到误差估计就懵。作为微积分历史系列的第六篇、泰勒公式部分的下篇,这篇我打算把镜头从十八世…

2026/10/15 10:27:23 阅读更多 →
起重机防摇摆与自动定位控制系统:从单摆模型到闭环控制的工程实践

起重机防摇摆与自动定位控制系统:从单摆模型到闭环控制的工程实践

简介:这份PPT面向起重机电气控制、自动化及工业控制领域的工程师与技术人员,系统讲解起重机防摇摆及防摇摆自动定位控制系统的原理与实现。内容涵盖防摇摆控制的发展历史、主要好处、开环与闭环两类基本方案、POSICAST控制方法、防摇控制数学模型&#x…

2026/10/15 10:26:23 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/15 9:49:14 阅读更多 →