news 2026/10/2 13:55:33

元宝 LeetCode 207. 课程表 Java实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
元宝 LeetCode 207. 课程表 Java实现

LeetCode 207. 课程表(Course Schedule)Java 实现

题目简述

一共有
“numCourses” 门课程,编号
“0 ~ numCourses-1”。给定
“prerequisites” 数组,其中
“prerequisites[i] = [a, b]” 表示 想学课程 a 必须先学课程 b。判断是否能完成所有课程。

本质:判断有向图中是否存在环(有环则无法完成)。

思路:拓扑排序(BFS / Kahn 算法)

核心思想

  1. 统计每门课的入度(有多少先修依赖)
  2. 把所有入度为 0 的课入队(不依赖任何课的课)
  3. 逐个出队,"学完"该课后把它指向的课的入度减 1
  4. 如果某门课入度变为 0,加入队列
  5. 最终学完的课数 == 总课数,则无环,可以学完

Java 实现

class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
// 入度数组:indegree[i] 表示学课程 i 前需要先学的课程数
int[] indegree = new int[numCourses];
// 邻接表:graph[i] 存的是学了课程 i 之后可以学的课程列表
List<List> graph = new ArrayList<>();
for (int i = 0; i < numCourses; i++) {
graph.add(new ArrayList<>());
}

// 构建图和入度 for (int[] pre : prerequisites) { int course = pre[0]; // 想学的课 int need = pre[1]; // 先修的课 graph.get(need).add(course); indegree[course]++; } // 把所有入度为 0 的课加入队列 Queue<Integer> queue = new LinkedList<>(); for (int i = 0; i < numCourses; i++) { if (indegree[i] == 0) { queue.offer(i); } } int finished = 0; // 已学完的课数 while (!queue.isEmpty()) { int curr = queue.poll(); finished++; // 学完 curr,它指向的所有课的入度减 1 for (int next : graph.get(curr)) { indegree[next]--; if (indegree[next] == 0) { queue.offer(next); } } } // 全部学完说明无环 return finished == numCourses; }

}

复杂度分析

维度 复杂度
时间 O(V + E),V 为课程数,E 为先修关系数
空间 O(V + E),邻接表 + 入度数组

示例说明

输入: numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[3,2]]
输出: true
解释: 合理顺序如 0 → 1 → 2 → 3(或 0 → 2 → 1 → 3)

输入: numCourses = 2, prerequisites = [[1,0],[0,1]]
输出: false
解释: 0 依赖 1,1 依赖 0,形成环,无法完成

常见坑点

  1. 入度含义别搞反:
    “[a, b]” 是 a 依赖 b,所以 b 指向 a,a 的入度 +1
  2. 邻接表存的是"学完某课后能学的课",方向别存反

“finished == numCourses” 是判断无环的关键,不用人为计数边数

延伸

  • DFS 三色标记法 也能判环(白/灰/黑),思路和 BFS 等价
  • 如果题目问 输出一个合法的修课顺序,那就是 LeetCode 210. 课程表 II,只需把
    “finished” 换成记录顺序的数组即可

需要我补充 DFS 判环版 或 LeetCode 210 输出拓扑排序 的 Java 实现吗?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 13:55:22

Python变量与内存管理

变量与内存管理把与C语言中的变量做一个对比, 可以更好地去了解理解那个变量。变量变量在C语言中全局变量, 指的是那些被放置在内存的静态变量区域里面的数据。所谓的局部变量, 它是在代码块中作为存放在内存里的代码区的一部分而存在的, 当这个局部变量被调用的是, 它就存放在…

作者头像 李华
网站建设 2026/10/2 13:54:39

CANoe Panel可视化面板实战:从信号绑定到CAPL联动

做车载总线开发的朋友&#xff0c;几乎都绕不开 Vector CANoe。客气点说它是一套强大的总线开发测试工具&#xff0c;不客气地说&#xff0c;第一次打开它的人&#xff0c;光看那一堆窗口就能被劝退一半。今天这篇我想专门讲讲 CANoe 里一个不起眼、但实际项目里特别好用的功能…

作者头像 李华
网站建设 2026/10/2 13:52:20

CCF CSP历年真题C++解答:刷题方法、套路与避坑指南

简介&#xff1a;面向CCF CSP认证考生的C版历年真题解答合集&#xff0c;基于历年真实赛题整理&#xff0c;帮助备赛者通过源码研读掌握算法设计与编程实现&#xff0c;适合自学与系统训练。解答按年份与题号命名cpp文件&#xff0c;内容覆盖基础语法、数组/链表/栈/队列/树/图…

作者头像 李华
网站建设 2026/10/2 13:52:20

Nacos 集群 `9849` 偶发超时:一次容器线程数异常的排查记录

环境&#xff1a;3 节点 Nacos 集群&#xff0c;Docker Compose 部署&#xff0c;network_mode: host&#xff0c;外部 MySQL。集群 3.1.1 &#xff0c;节点间偶发 gRPC 超时&#xff0c;曾伴随服务调用失败和健康节点列表抖动。本文记录当时的证据、排查过程及处理结果。 现象…

作者头像 李华
网站建设 2026/10/2 13:51:51

小白程序员必看!大模型学习指南:从单智能体到多智能体协作

工业AI正从单智能体走向多智能体协作&#xff0c;本文深入分析了单智能体的局限性&#xff0c;包括专业深度不够、上下文容量有限、并行效率太低、可靠性与隔离性差等&#xff0c;并介绍了多智能体协同架构的三种模式&#xff1a;层级式、网状式、混合式&#xff0c;以及任务拆…

作者头像 李华