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/7/29 1:34:10阅读更多 →
“智能”还是“智障”?——拆解AI报表生成器底层推理链的4个黑箱陷阱(含LLM+OLAP联合调试日志)

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

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

2026/7/29 1:34:10阅读更多 →
为什么你的 WordPress 后台总有一堆英文?聊聊“原生中文主题”与“汉化版”的坑

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

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

2026/7/29 1:34:10阅读更多 →
桌面金属3D打印:从FDM到烧结的全流程解析与避坑指南

桌面金属3D打印:从FDM到烧结的全流程解析与避坑指南

1. 从“塑料玩具”到“金属零件”:桌面级金属3D打印的平民化革命如果你和我一样,是个喜欢在工作室里捣鼓各种原型和零件的爱好者,那你一定对3D打印不陌生。从PLA到ABS,再到尼龙、碳纤维复合材料,我们能用桌面级FDM打印…

2026/7/29 2:44:22阅读更多 →
LangGraph实战:从零构建多智能体系统的图结构工作流

LangGraph实战:从零构建多智能体系统的图结构工作流

如果你正在为如何构建复杂的多智能体系统而头疼,觉得现有的 LangChain 框架在处理复杂工作流时力不从心,那么 LangGraph 的出现可能正是你需要的解决方案。与传统的线性链式调用不同,LangGraph 引入了图结构来编排智能体,让多角色…

2026/7/29 2:44:22阅读更多 →
嵌入式离线语音识别实战:基于行空板K10的关键词识别与诗词检索系统

嵌入式离线语音识别实战:基于行空板K10的关键词识别与诗词检索系统

1. 项目概述:当古典诗词遇见现代语音交互最近在捣鼓行空板K10,一个想法突然冒了出来:能不能让这块小巧的开发板“听懂”人话,然后自动识别出你念的是哪首古诗?这个念头,就是“诗王小行”项目的起点。它本质…

2026/7/29 2:44:22阅读更多 →
使用Swagger在线调试RESTful接口

使用Swagger在线调试RESTful接口

使用Swagger在线调试RESTful接口在现代软件开发中,尤其是前后端分离架构成为主流的今天,RESTful API已成为系统间通信的核心纽带。然而,API的设计、开发、测试与文档维护工作往往繁琐且易出错。Swagger(现称OpenAPI规范&#xff0…

2026/7/29 2:44:22阅读更多 →
Fly.io战略转向AI智能体平台Sprites:边缘计算与AI工程化融合

Fly.io战略转向AI智能体平台Sprites:边缘计算与AI工程化融合

如果你正在使用 Fly.io 部署应用,或者关注云原生和 AI 基础设施的最新动态,那么最近的一条消息值得你停下来仔细看看:Fly.io 的创始人兼 CEO Kurt Mackey 即将卸任,而这家以轻量、快速的边缘部署著称的平台,正在将战略…

2026/7/29 2:44:22阅读更多 →
架构演进的绞杀者与修缮

架构演进的绞杀者与修缮

架构演进的绞杀者与修缮在软件工程的世界里,架构演进是一场永不停息的辩证运动。一边是创新与变革的冲动,另一边是稳定与延续的需求。这场运动的两个关键角色——绞杀者与修缮者——构成了架构演进的双重叙事。绞杀者:激进重构的化身绞杀者模…

2026/7/29 2:42:21阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“! 在构建复杂的 Agent 系统时,我们经常会遇到这样的场景:Agent 正在执行一个多步骤的任务,比如“下单购买商品”,但执行到一半时,我们…

2026/7/29 0:01:46阅读更多 →
自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

近日,国际专注开放式技术研发的声学品牌Nank南卡,正式官宣实力艺人曾舜晞担任品牌代言人。消息一经发出便轰动全网。为什么耳机品牌不选择流量明星、老牌歌手?而且是选择曾舜晞?让我们一起来探索一下!比起短期的流量&a…

2026/7/29 0:01:46阅读更多 →
【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:01:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/28 20:22:24阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →