尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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 判环时是否区分了未访问、正在访问、已完成三种状态。
RELATED

相关推荐

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

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

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

📅 2026/9/13 11:32:37
“智能”还是“智障”?——拆解AI报表生成器底层推理链的4个黑箱陷阱(含LLM+OLAP联合调试日志)

“智能”还是“智障”?——拆解AI报表生成器底层推理链的4个黑箱陷阱(含LLM+OLAP联合调试日志)

更多请点击: https://codechina.net 第一章:AI 自动生成报表 AI 自动生成报表正逐步取代传统手工编制与脚本驱动的报表流程,通过自然语言理解、结构化数据解析和模板化渲染能力,实现从原始数据到可交付业务文档的端到端自动化。该…

📅 2026/9/21 12:37:21
为什么你的 WordPress 后台总有一堆英文?聊聊“原生中文主题”与“汉化版”的坑

为什么你的 WordPress 后台总有一堆英文?聊聊“原生中文主题”与“汉化版”的坑

很多刚接触 WordPress 的朋友都会遇到一个尴尬的情况:在各大市场精心挑选了一个颜值在线的主题,安装激活后,前台看着挺美,一进后台——傻眼了,满屏的英文选项,或者更糟的是,一半中文一半英文的“…

📅 2026/9/26 19:45:04
MORE NEWS

更多资讯

📰

中专财务突破薪资瓶颈:从Excel到SQL的数据分析进阶路线

1. 中专财务的薪资天花板,到底卡在哪里1.1 学历不是唯一的墙,关键是你会什么中专学历做财务,这五个字放在招聘网站上,系统能筛掉一大半简历。我认识的很多中专财务朋友,工作三五年后普遍卡在4500到7000这个区间&#x…

📰

模型优化器实战:从800ms到170ms的推理加速与精度平衡

1. 模型优化器到底在优化什么第一次看到“Model-Optimizer”这个词,很多人会下意识觉得它就是一个调参工具,或者某个深度学习框架里的一个优化器类。但真正在项目里用过一轮之后,我的理解是:它更像是一套围绕模型全生命周期的性能…

📰

ESP32开发怎么选?Arduino、ESP-IDF、MicroPython对比与选型指南

手里同时玩过好几块 ESP32 的人,估计都被同一个问题问过:Arduino、ESP-IDF、MicroPython 到底选哪个?就我自己的折腾经历来说,这三条路不是谁替代谁的关系,而是三种完全不同的开发节奏。我见过用 Arduino 一周就把蓝牙…

📰

CLI-Anything:声明式 CLI 运行时基础设施

1. 项目概述:CLI-Anything 不是又一个命令行工具,而是 CLI 生态的“操作系统级抽象层”你有没有遇到过这样的场景:想用某个新工具,第一反应不是“它能做什么”,而是“它怎么装?装在哪?PATH 对不…

📰

CLI-Anything:面向智能体的可插拔CLI能力中枢

1. 项目概述:CLI-Anything 不是又一个命令行工具,而是 CLI 范式的重新定义“CLI-Anything”这个名字乍看像一句口号,但实际它指向一个正在快速成型的开发范式——不是把某个功能封装成命令行接口,而是让任何能力、任何服务、任何模…

📰

高维空间百年直觉被推翻:超立方体密铺反例的计算机搜索之路

前阵子,合作群里有人扔来一份预印本,标题很朴素,但里面那个结果让我连续几天都没缓过来:他们找到了一组反例,把几何拓扑里一个流传了一百五十年的老直觉彻底推翻。这个问题的通俗版本,其实用家里铺地板就能…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬