LeetCode 207. 课程表
题目描述这个学期需要选修numCourses门课程课程编号为0到numCourses - 1。数组prerequisites表示课程之间的先修关系其中prerequisites[i] [ai, bi]表示如果要学习课程ai必须先学习课程bi。例如[0, 1]表示想学习课程0需要先完成课程1。要求判断是否可以完成所有课程。如果可以返回true否则返回false。初始思路一开始想到的是把二维数组转成链表然后判断链表里是否存在循环。但这题不是普通链表问题。一个课程可能有多个后续课程也可能被多个课程依赖所以它本质上是一张有向图不是一条链表。如果课程之间存在环就说明有些课程互相依赖无法完成所有课程。例如0 - 1 1 - 0这就表示学习0之前要先学1学习1之前又要先学0形成了死循环。解题思路这题可以用 DFS 判断有向图中是否存在环。先根据prerequisites建图g[p[1]].add(p[0]);这里的方向是先修课 - 后续课也就是如果p [a, b]表示学a之前必须先学b所以建边b - a。然后用三色标记记录每个课程的访问状态0未访问。1正在访问。2已经访问完成。DFS 过程中如果遇到一个状态为1的节点说明这个节点还在当前递归路径上又被重新访问到了所以存在环。如果存在环就无法完成所有课程返回false。为什么需要三色标记这题不能只用一个简单的visited。因为有向图判环时需要区分两种状态这个点以前访问过并且已经确认它后面的路径没有环。这个点正在当前 DFS 路径中还没有退出递归。只有遇到“正在访问”的点才说明形成了环。也就是代码里的if (color[y] 1) { return true; }当一个节点的所有后续节点都 DFS 完成后要把它标记成2color[x] 2;表示这个点已经检查完成以后再遇到它就不用重复搜索。易错点1. 建图方向prerequisites[i] [ai, bi]的含义是学ai之前要先学bi。所以边的方向应该是bi - ai对应代码g[p[1]].add(p[0]);2. DFS 结束后要标记为完成如果一个点搜索完没有发现环要把它从1改成2。否则其他路径再次访问到它时可能会误以为遇到了环。3. 外层要遍历所有课程图不一定是连通的。有些课程可能和课程0完全不在一个连通块里所以不能只从一个课程开始 DFS而是要遍历所有课程for (int i 0; i numCourses; i) { if (color[i] 0 dfs(i, g, color)) { return false; } }代码实现class Solution { public boolean canFinish(int numCourses, int[][] prerequisites) { ListInteger[] g new ArrayList[numCourses]; Arrays.setAll(g, i - new ArrayList()); int[] color new int[numCourses]; for (int[] p : prerequisites) { g[p[1]].add(p[0]); } for (int i 0; i numCourses; i) { if (color[i] 0 dfs(i, g, color)) { return false; } } return true; } public boolean dfs(int x, ListInteger[] g, int[] color) { color[x] 1; for (int y : g[x]) { if (color[y] 1 || color[y] 0 dfs(y, g, color)) { return true; } } color[x] 2; return false; } }复杂度分析时间复杂度O(numCourses prerequisites.length)。每个课程节点和每条先修边最多被访问一次。空间复杂度O(numCourses prerequisites.length)。邻接表需要存储所有边递归栈和颜色数组最多需要O(numCourses)。复盘这题的关键是把课程关系看成一张有向图然后判断图里有没有环。最开始想用链表判环是因为抓住了“循环依赖”这个方向但没有意识到课程关系不是一条链而是可能一对多、多对一的图结构。下次遇到类似题时可以先检查三点依赖关系能不能抽象成有向图。边方向是否是先修课 - 后续课。DFS 判环时是否区分了未访问、正在访问、已完成三种状态。

相关新闻

浏览器又没网了?微信正常但网页打不开,我的修复踩坑记录

浏览器又没网了?微信正常但网页打不开,我的修复踩坑记录

🎉🎉🎉耶耶耶,今天终于解决了这个困扰我很久的问题!必须记录下来,帮到下一个被这个 bug 折磨的人。💻适用场景:右下角网络图标明明显示“已连接”,微信、QQ 都能正常聊天…

2026/10/19 23:21:15 阅读更多 →
【AI知识管理黄金法则】:20年资深架构师亲授5大实战框架,90%团队尚未掌握的智能知识沉淀术

【AI知识管理黄金法则】:20年资深架构师亲授5大实战框架,90%团队尚未掌握的智能知识沉淀术

更多请点击: https://codechina.net 第一章:AI知识管理的本质与范式跃迁 AI知识管理已超越传统文档检索与标签分类的静态范式,正演变为一种以语义理解、动态关联和主动推理为核心的认知基础设施。其本质并非将知识“存起来”,而是…

2026/10/19 23:21:17 阅读更多 →
GoBruteforcer僵尸网络攻击原理与Linux服务器防护实战

GoBruteforcer僵尸网络攻击原理与Linux服务器防护实战

1. GoBruteforcer僵尸网络攻击原理剖析GoBruteforcer是一种基于Go语言开发的自动化攻击工具,其核心攻击模式是通过构建僵尸网络(Botnet)对Linux服务器实施分布式暴力破解。这种攻击主要针对三类常见服务端口:FTP服务(默…

2026/10/19 23:21:20 阅读更多 →

最新新闻

基于语义向量的名著推荐系统:从协同过滤到Django工程实践

基于语义向量的名著推荐系统:从协同过滤到Django工程实践

1. 为什么经典名著做推荐,比想象中难得多我做在线阅读平台的项目已经有几年了,从资讯流到工具类产品都碰过,但真正让我觉得"推荐系统不是套个协同过滤就能完事"的,恰恰是这个古典名著推荐项目。以前做过的商品推荐、视频…

2026/10/20 17:55:50 阅读更多 →
WorkBuddy链接微信实战:用Webhook将消息流改造成自动化工作流

WorkBuddy链接微信实战:用Webhook将消息流改造成自动化工作流

这个系列写到第七篇,前面几篇已经把 WorkBuddy 的安装部署、任务编排、数据看板这些底层能力聊了不少。但说实话,后台私信里问得最多的,反而是“我的微信能不能接进去”。这其实不奇怪——大部分人日常最高频的信息入口就是微信,工…

2026/10/20 17:55:50 阅读更多 →
小熊派nano环境搭建实战:交叉编译与固件烧录全流程

小熊派nano环境搭建实战:交叉编译与固件烧录全流程

第一次拿到小熊派nano这块板子,很多人的第一反应是先找个教程点个灯。但真走到“点灯”这一步,中间隔着的不是一根杜邦线,而是一整条工具链:电脑上得装对应的交叉编译器,得把官方源码仓库完整克隆到本地,还…

2026/10/20 17:55:49 阅读更多 →
无ESDF的无人机局部规划器EGO-Planner:B样条轨迹优化解析

无ESDF的无人机局部规划器EGO-Planner:B样条轨迹优化解析

1. 这篇论文到底解决了什么问题1.1 传统ESDF为什么会让局部规划器“变重”ESDF是Euclidean Signed Distance Field的缩写,每个体素里存的是它到最近障碍物表面的有符号距离。对于轨迹优化来说,这个东西太好用了:只要查询某个空间点&#xff0…

2026/10/20 17:55:49 阅读更多 →
AI数据安全实战:从投毒、注入到泄露的防御与排查

AI数据安全实战:从投毒、注入到泄露的防御与排查

聊AI人工智能领域的数据安全,很多人的第一反应是权限、加密、备份。但在真实的大模型项目里,这些传统手段往往只是基础,数据泄露真正让人头疼的地方在于:数据一旦进入模型,就很难被"删掉"。模型会记住某些训…

2026/10/20 17:55:49 阅读更多 →
大模型入门必读:从深度学习原理到工程实战的系统书单

大模型入门必读:从深度学习原理到工程实战的系统书单

最近这半年,总有人在后台问我:“我想入门大模型,该看什么书?”老实说,每次被问到这个问题,我都挺为难的。现在网上关于大模型的书单五花八门,有讲算法的、有讲应用的、有讲产业趋势的&#xff0…

2026/10/20 17:54:48 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →