当前位置: 首页 > news >正文

LeetCode热题--207. 课程表--中等 - 教程

1. 题目

你这个学期必须选修 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 。这

2. 题解

class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
// 入度数组,用于记录每门课程的入度
int[] inDegree = new int[numCourses];
// 邻接表,存储每门课程的后续课程
List<List<Integer>> adjList = new ArrayList<>();for (int i = 0; i < numCourses; i++) {adjList.add(new ArrayList<>());}// 计算每门课程的入度,并构建邻接表for (int[] prerequisite : prerequisites) {int course = prerequisite[0];int preCourse = prerequisite[1];inDegree[course]++;adjList.get(preCourse).add(course);}// 存储入度为 0 的课程的队列Queue<Integer> queue = new LinkedList<>();for (int i = 0; i < numCourses; i++) {if (inDegree[i] == 0) {queue.offer(i);}}// 记录已完成课程的数量int count = 0;while (!queue.isEmpty()) {int selectedCourse = queue.poll();count++;// 获取当前课程的后续课程列表List<Integer> nextCourses = adjList.get(selectedCourse);for (int nextCourse : nextCourses) {// 后续课程的入度减 1inDegree[nextCourse]--;if (inDegree[nextCourse] == 0) {queue.offer(nextCourse);}}}// 如果已完成课程的数量等于总课程数,则可以完成所有课程return count == numCourses;}}

3. 解析

出自:「图解」拓扑排序 | 课程表问题

int[] inDegree = new int[numCourses];: 初始化一个数组来记录每门课程的入度,表示从其他课程到当前课程的箭头数量。

一个列表的列表,其中每个内部列表表示一门课程及其所有的后续课程。就是List<List> adjList = new ArrayList<>();: 创建一个邻接表(Adjacency List)用于存储每门课程的后续课程。这
for (int i = 0; i < numCourses; i++) { adjList.add(new ArrayList<>()); }: 初始化邻接表中的空列表以匹配每门课程的数量。

4-7: 遍历所有预备课程,计算每个课程的入度并构建邻接表。对于每一对预备课程(preCourse, course),将course的入度加1,并将preCourse添加到course的后续课程列表中。
Queue queue = new LinkedList<>();: 创建一个队列来存储所有入度为0的课程。这是因为这些课程没有先决条件(即它们是可以直接选修的课程)。

9-15: 遍历所有的课程,将那些入度为0的课程添加到队列中。
int count = 0;: 初始化一个计数器来记录已经搞定的课程数量。

17-24: 开始主循环,直到队列为空(即没有任何可以选择的课程了)或者已完成的课程数量等于总课程数(表示所有课程都能够结束)。在每一轮中,从队列中取出一门课程进行处理(增加计数器并将其后续课程的入度减1),如果任何一个后续课程的入度降为0(即没有先决条件了),就将它添加到队列中。

25: 最后返回已结束课程数量是否等于总课程数来判断能否完成所有课程。
拓扑排序的一种实现方式,用于解决课程表问题(Schedule of Courses),如果能凭借所有的入度为0的课程,那么就可以完成所有课程。就是这段代码

http://www.zskr.cn/news/20998.html

相关文章:

  • 杰理GPIO状态设置
  • 深入理解 AbstractQueuedSynchronizer(AQS):构建高性能同步器的基石 - 指南
  • 2025 年清洗机厂家最新推荐:高压清洗机、超声波清洗机等多类型设备企业品牌权威榜单,帮企业高效筛选优质清洗设备
  • 从零开始:用C#开发的海量文件内容秒搜神器TDSContent——免费开源高效办公必备!
  • 2025 旋转蒸发仪选型指南:适配科研与生产需求的优质厂家 TOP5 推荐
  • 移动终端安全:实验2-创建自签名证书对APP签名 - 详解
  • Day3整形输入
  • 2025优质电缆/防火/模压/瓦楞/大跨距/热镀锌/热浸锌/不锈钢/光伏/铝合金/锌铝镁桥架厂家推荐:五家实力企业的技术与服务特色解析
  • 2025 领域优质石油/电厂/钢铁厂/化工/消防/船舶/住宅/管道/隧道/地铁电伴热带厂家推荐榜单,工业与民用场景全覆盖
  • 2025年10月学术会议全名单!科研人请抢先收藏,别错过关键节点!
  • python对比“解包赋值”和 match 语句中的“解构”
  • 观点分享:Oracle数据库GRID升级的案例的闲聊
  • 2025 佛山高尔夫模拟器厂家推荐:从家庭到专业场景的靠谱之选
  • 高速采集卡:解锁海量数据洪流,驱动精准测量新时代
  • 基于MATLAB的HOG+SVM行人检测
  • 网络文件共享系统NFS服务搭建
  • C# 泛型懒汉单例类
  • MyEMS 支撑公共建筑低碳运营:多维度能耗建模逻辑与运行优化策略
  • 实时检测机器人广告点击的深度学习技术
  • 开源生态视角下 MyEMS 的能源管理系统国产化实践:架构设计与自主可控路径
  • 【IEEE出版】第七届机器学习、大数据与商务智能国际会议(MLBDBI 2025)
  • 2025 年国内优质货代公司最新推荐排行榜:深度解析头部企业服务能力,助力企业精准选合作伙伴泰国货代/印尼货代/马来货代/日本货代/东南亚货代公司推荐
  • 国标GB28181算法算力平台EasyGBS在食品安全监管系统中的融合与应用方案
  • springcloud和dubbo有什么区别
  • mysql默认事务隔离级别,从入门到精通的完全指南
  • 利用 OpenTelemetry 集成 JMX 监控
  • 深入浅出 Go slices 包:类型安全、内存安全与高性能实践
  • 斑马日记2025.10.10
  • 入门指南:使用 Playwright MCP Server 为你的 AI Agent 赋予浏览器自动化能力
  • 实战教程:构建能交互网页的 AI 助手——基于 Playwright MCP 的完整项目