207. 课程表
207. 课程表中等提示你这个学期必须选修numCourses门课程记为0到numCourses - 1。在选修某些课程之前需要一些先修课程。 先修课程按数组prerequisites给出其中prerequisites[i] [ai, bi]表示如果要学习课程ai则必须先学习课程bi。例如先修课程对[0, 1]表示想要学习课程0你需要先完成课程1。请你判断是否可能完成所有课程的学习如果可以返回true否则返回false。示例 1输入numCourses 2, prerequisites [[1,0]] 输出true 解释总共有 2 门课程。学习课程 1 之前你需要完成课程 0 。这是可能的。示例 2输入numCourses 2, prerequisites [[1,0],[0,1]] 输出false 解释总共有 2 门课程。学习课程 1 之前你需要先完成课程 0 并且学习课程 0 之前你还应先完成课程 1 。这是不可能的。提示1 numCourses 20000 prerequisites.length 5000prerequisites[i].length 20 ai, bi numCoursesprerequisites[i]中的所有课程对互不相同 核心笔记课程表 (拓扑排序 / DFS 找环)1. 核心思想 (一句话总结)“红绿灯机制遇到‘黄灯’就是追尾环遇到‘红灯’就是安全。”我们需要区分三种状态防止重复计算并精准定位“回边”。0 (White/未访问)处女地没去过。1 (Gray/正在访问)当前递归栈中的节点黄灯。如果在递归中又遇到了 1说明咬到了自己的尾巴 - 有环2 (Black/已完成)死胡同或已经确认安全的节点红灯。下次遇到直接跳过不用再跑一遍。2. 算法流程 (三步走)建图 (Adjacency List)把[课程, 前置]转化为前置 - 课程的邻接表。遍历所有节点图可能不是连通的所以外层要用for循环遍历每一个节点。DFS (三色状态流转)进门标记为1(正在经手)。查邻居邻居是1报警有环邻居是0递归进去查。邻居是2安全的无视。出门标记为2(封存归档)表示从我出发的所有路都走通了且没环。 代码回忆清单 (带注释版)✅ 举例假设prerequisites [[1,0], [2,0], [3,1]]循环过程p [1, 0]→g[0].add(1)→g[0] [1]p [2, 0]→g[0].add(2)→g[0] [1, 2]p [3, 1]→g[1].add(3)→g[1] [3]最终邻接表g[0] [1, 2] // 学完 0 可以学 1 或 2 g[1] [3] // 学完 1 可以学 3 g[2] [] // 学完 2 没有后续课程 g[3] [] // 学完 3 没有后续课程// 题目LC 207. Course Schedule class Solution { public boolean canFinish(int numCourses, int[][] prerequisites) { // 1. 建图 (邻接表) //创建一个数组每个元素是一个列表 ListInteger[] g new ArrayList[numCourses]; //给每个位置初始化一个空列表 Arrays.setAll(g, i - new ArrayList()); for (int[] p : prerequisites) { // p[1] 是先修课p[0] 是后修课 // 边方向先修 - 后修 // 从先修课 p[1] 指向后修课 p[0] g[p[1]].add(p[0]); } // 2. 状态数组 (0:未访, 1:递归中, 2:已完成) int[] colors new int[numCourses]; // 3. 处理非连通图 (孤岛也要查) for (int i 0; i numCourses; i) { // 只有没访问过的才进 DFS // 如果 dfs 返回 true说明找到了环也就是无法完成 - return false if (colors[i] 0 dfs(i, g, colors)) { return false; } } return true; // 全跑完了没发现环 } // 返回值true 表示“发现了环” private boolean dfs(int x, ListInteger[] g, int[] colors) { colors[x] 1; // 标记我正在这条路径上 (入栈) // g[x] 是学完 x 后可以学的课程列表。 // y 就是其中一个后续课程。 for (int y : g[x]) { // 核心判断逻辑 if (colors[y] 1) { return true; // 撞见自己人/祖先了 - 环 } if (colors[y] 0 dfs(y, g, colors)) { return true; // 递归子节点发现了环层层上报 } // colors[y] 2 的情况直接跳过 (剪枝) } colors[x] 2; // 标记我和我的子孙都检查过了没问题 (出栈) return false; // 平安无事 } }⚡ 快速复习 CheckList (易错点)[ ]为什么不能只用 boolean visited普通的visited只能分“去过”和“没去过”。我们需要区分是“当前递归路径里遇到过 (环)”还是“别的路径已经验证过是安全的 (剪枝)”。这就是状态1和2的区别。[ ]返回值逻辑绕晕了dfs返回true有坏人 (有环)。主函数if (dfs(...))成立说明有环课程表没法修完所以主函数返回false。负负得正的逻辑要理清。[ ]边的方向通常题目给[A, B]表示修 A 必须先修 B。建图最好是B - A(学了 B 才能学 A)。这样如果有环逻辑依然成立。️ 数字演练假设依赖0 - 11 - 0(互为前置死循环)。DFS(0)Colors[0] 1。看邻居1。1是颜色0- 递归DFS(1)。DFS(1)Colors[1] 1。看邻居0。关键点0的颜色是1(说明 0 还在递归栈里还没有变绿)。Return True(发现环)。Back to DFS(0)收到子递归的True。Return True。Main收到True(有环)。Return False(不能完成)。

相关新闻

AI原生应用开发:模型蒸馏的常见误区与避免方法

AI原生应用开发:模型蒸馏的常见误区与避免方法

AI原生应用开发:模型蒸馏的常见误区与避免方法关键词:模型蒸馏、AI原生应用、知识迁移、教师模型、学生模型、蒸馏损失、部署优化摘要:在AI原生应用开发中,大模型虽性能强大却面临部署成本高、推理延迟大的问题。模型蒸馏作为“大…

2026/5/17 5:41:28 阅读更多 →
提示工程:技巧、方法与未来发展

提示工程:技巧、方法与未来发展

原文:towardsdatascience.com/prompt-engineering-tips-approaches-and-future-directions-d6baf5f12285?sourcecollection_archive---------1-----------------------#2024-06-27 https://towardsdatascience.medium.com/?sourcepost_page---byline--d6baf5f1228…

2026/7/3 22:03:32 阅读更多 →
SpringBoot+Vue 绿城郑州爱心公益网站管理平台源码【适合毕设/课设/学习】Java+MySQL

SpringBoot+Vue 绿城郑州爱心公益网站管理平台源码【适合毕设/课设/学习】Java+MySQL

💡实话实说:有自己的项目库存,不需要找别人拿货再加价,所以能给到超低价格。摘要 随着社会公益事业的快速发展,信息化管理成为提升公益组织效率和服务质量的关键手段。绿城郑州爱心公益网站管理平台旨在通过数字化技术…

2026/7/5 18:43:44 阅读更多 →

最新新闻

【git教程】科研技能必备——git的使用

【git教程】科研技能必备——git的使用

【git教程】科研技能必备——git的使用 git的知识其实常用的就那几个,由于网上的教程有很多,笔者感觉能给各位读者做的也只有帮忙筛选了。 注:其实这些git的命令行操作在目前主流的IDE(如VScode,cursor)上已经集成好了…

2026/7/6 4:14:17 阅读更多 →
个人数据主权革命:WeChatMsg如何重新定义数字记忆资产管理

个人数据主权革命:WeChatMsg如何重新定义数字记忆资产管理

个人数据主权革命:WeChatMsg如何重新定义数字记忆资产管理 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…

2026/7/6 4:14:17 阅读更多 →
web应用技术作业10

web应用技术作业10

完成自己项目的分页显示、条件查询、添加、删除、修改等功能分页显示:条件查询:添加:删除:修改:

2026/7/6 4:12:16 阅读更多 →
为什么我们需要SDD(规格驱动开发)

为什么我们需要SDD(规格驱动开发)

输入“使用 FastAPI 在 Python 中创建一个登录接口。”改一下提示词:“使用JWT”。想了想,再输入:“数据存储到MySQL”。如此来回折腾数次之后,满心欢喜的交付给测试。这就是Vibe Coding,你和大模型进行对话&#xff0…

2026/7/6 4:10:16 阅读更多 →
Java3:Java运算符详解:编程世界的加减乘除

Java3:Java运算符详解:编程世界的加减乘除

目录 写在前面 一、运算符是什么? 二、算术运算符:最基础的数学工具 2.1 基本四则运算: - * / % 2.2 增量运算符: - * / % 2.3 自增/自减运算符: -- 三、关系运算符:比较大小的利器 四、逻辑运算符&…

2026/7/6 4:10:16 阅读更多 →
Kubernetes 资源隔离:AI 任务别和核心服务抢饭碗

Kubernetes 资源隔离:AI 任务别和核心服务抢饭碗

Kubernetes 资源隔离:AI 任务别和核心服务抢饭碗 一、AI 任务很容易吃资源 AI 推理、批处理、向量化、模型评测都会消耗 CPU、内存、GPU 和 IO。如果这些任务和核心在线服务混在同一个资源池里,低优先级任务就可能把在线服务挤慢。Kubernetes 提供很多隔…

2026/7/6 4:10:16 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻