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

【Leetcode 热题 100】207. 课程表

问题背景

你这个学期必须选修 n u m C o u r s e s numCourses numCourses 门课程,记为 0 0 0 n u m C o u r s e s − 1 numCourses - 1 numCourses1
在选修某些课程之前需要一些先修课程。 先修课程按数组 p r e r e q u i s i t e s prerequisites prerequisites 给出,其中 p r e r e q u i s i t e s [ i ] = [ a i , b i ] prerequisites[i] = [a_i, b_i] prerequisites[i]=[ai,bi],表示如果要学习课程 a i a_i ai必须 先学习课程 b i b_i bi
例如,先修课程对 [ 0 , 1 ] [0, 1] [0,1] 表示:想要学习课程 0 0 0,你需要先完成课程 1 1 1
请你判断是否可能完成所有课程的学习?如果可以,返回 t r u e true true;否则,返回 f a l s e false false

数据约束

  • 1 ≤ n u m C o u r s e s ≤ 2000 1 \le numCourses \le 2000 1numCourses2000
  • 0 ≤ p r e r e q u i s i t e s . l e n g t h ≤ 5000 0 \le prerequisites.length \le 5000 0prerequisites.length5000
  • p r e r e q u i s i t e s [ i ] . l e n g t h = 2 prerequisites[i].length = 2 prerequisites[i].length=2
  • 0 ≤ a i , b i < n u m C o u r s e s 0 \le a_i, b_i \lt numCourses 0ai,bi<numCourses
  • p r e r e q u i s i t e s [ i ] prerequisites[i] prerequisites[i] 中的所有课程对 互不相同

解题过程

判断是否是有向无环图的模板题,暴力的角度上看,深搜和广搜都能做,用图的入度来进行判断。
看了 灵神的题解 学到了三色标记法,进一步了解到这种方法能够解决拓扑排序的问题,决定目前的阶段先学到这种程度。
用三种状态来描述当前处理过程中节点的情况:

  • 如果当前节点尚未被访问,用 0 0 0 来标记。
  • 如果当前节点正在访问中(也就是当前正在处理与它相关的节点),用 1 1 1来标记。
  • 如果当前节点已经访问完毕,用 2 2 2 来标记。

如果图中无环,那么不应该出现在处理相关节点的过程中遇到状态为正在访问中的节点的情况。

具体实现

class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {List<Integer>[] graph = new ArrayList[numCourses];Arrays.setAll(graph, i -> new ArrayList<>());// 根据先后要求建图,所给二维数组中的第二个下标表示前置for(int[] item : prerequisites) {graph[item[1]].add(item[0]);}int[] colors = new int[numCourses];for(int i = 0; i < numCourses; i++) {if(colors[i] == 0 && dfs(i, graph, colors)) {return false;}}return true;}// 遍历方法返回的就是图中是否有环private boolean dfs(int cur, List<Integer>[] graph, int[] colors) {// 将当前节点标记为访问中colors[cur] = 1;// 依次访问这个从这个节点出发,能够到达的所有节点for(int next : graph[cur]) {// 判断是否遇到访问中的节点,并递归当前节点// 注意 Java 中逻辑与比逻辑或优先级要高,这里如果没有发生或运算短路,要先计算与if(colors[next] == 1 || colors[next] == 0 && dfs(next, graph, colors)) {return true;}}// 将当前节点标记为已访问过colors[cur] = 2;return false;}
}
http://www.lryc.cn/news/509890.html

相关文章:

  • 从CreateDialogIndirectParam起---我与大模型对话
  • 重温设计模式--建造者模式
  • CSS(五):定位
  • JSON 系列之2:JSON简单查询
  • SQL 简单查询
  • YOLOv9-0.1部分代码阅读笔记-metrics.py
  • KaiOS 4.0 | DataCall and setupData implemention
  • nginx-rtmp服务器搭建
  • [c++进阶(三)]单例模式及特殊类的设计
  • 企业内训|高智能数据构建和多模态数据处理、Agent研发及AI测评技术内训-吉林省某汽车厂商
  • 009 Qt_显示类控件_QLCDNumber、ProgressBar、Calendar
  • --spring.profiles.active=prod
  • 深入解析JVM中对象的创建过程
  • 使用开源在线聊天工具Fiora轻松搭建个性化聊天平台在线交流
  • ffmpeg之显示一个yuv照片
  • MySQL中Performance Schema库的详解(下)
  • 【Rust自学】7.1. Package、Crate和定义Module
  • 【Git】-- 版本说明
  • 1919C. Grouping Increases
  • Pion WebRTC 项目教程
  • 【安全编码】Web平台如何设计防止重放攻击
  • VUE3+django接口自动化部署平台部署说明文档(使用说明,需要私信)
  • Python爬虫(入门+进阶)
  • 保姆级教程Docker部署RabbitMQ镜像
  • 【RAII | 设计模式】C++智能指针,内存管理与设计模式
  • Linux复习3——管理文件系统2
  • c++---------数据类型
  • 前端Python应用指南(三)Django vs Flask:哪种框架适合构建你的下一个Web应用?
  • 鸿蒙系统文件管理基础服务的设计背景和设计目标
  • 要查询 `user` 表中 `we_chat_open_id` 列不为空的用户数量