文章目录

  • 题目描述
  • 思路 && 代码
    • 二刷

题目描述

  • 刷的第一道图相关的题,简直考古
  • 要复习一下拓扑、邻接矩阵之类的知识啦

思路 && 代码

  • 前置课程看成入度,后置课程看成出度
  • 对于入度,只需要记录有多少即可。
  • 对于出度,逐个记录下来(用于完成后,更新对应结点的入度)
  • 初始化:从入度为0的结点开始记录
  • BFS:可行课程加入队列中,先进先出地更新出入度。
  • 时空复杂度:都是O(m + n),结点和边都要遍历到
class Solution {// BFS,时空复杂度都是 O(M + N),所有的邻边、结点都要遍历到public boolean canFinish(int numCourses, int[][] prerequisites) {// 0. Initint[] indegrees = new int[numCourses]; // 入度记录Queue<Integer> queue = new LinkedList<>(); // BFS:当前可行结点记录List<List<Integer>> adjacency = new ArrayList<>(); // 出度结点记录for(int i = 0; i < numCourses; i++) {adjacency.add(new ArrayList<>());}// 1. 入度、出度记录for(int[] cp : prerequisites) {indegrees[cp[0]]++; // 入度计算adjacency.get(cp[1]).add(cp[0]); // 出度记录}// 2. 从入度为0的结点开始BFSfor(int i = 0; i < numCourses; i++) {// 初始化:从入度为0的结点开始if(indegrees[i] == 0) {queue.add(i);}}// 3. 队列不为空时,每次移除一个队列课程,同时维护相关的出入度while(!queue.isEmpty()) {int pre = queue.poll();numCourses--;// 根据结点的出度列表,维护对应结点的入度值for(int temp : adjacency.get(pre)) {// 入度值为0时,加入可行结点的队列中if(--indegrees[temp] == 0) {queue.add(temp);}}}return numCourses == 0;}
}

二刷

  • 其实还是挺不错的一道题啦,步骤清晰、结构简单、思路明了,而且代码就19行
  • 步骤分为三个部分:初始化、出入度初始化、课程维护
class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {// Part 1: initint[] in = new int[numCourses]; List<List<Integer>> out = new ArrayList<>(); for(int i = 0; i < numCourses; i++) {out.add(new ArrayList<>());}// Part 2: 出入度维护for(int i = 0; i < prerequisites.length; i++) {in[prerequisites[i][0]]++;out.get(prerequisites[i][1]).add(prerequisites[i][0]);}// Part 3: 课程清除Deque<Integer> queue = new ArrayDeque<>(); for(int i = 0; i < in.length; i++) {if(in[i] == 0) {queue.offer(i);numCourses--;}}while(!queue.isEmpty()) {int pre = queue.poll();for(int temp : out.get(pre)) {if(--in[temp] == 0) {numCourses--;queue.offer(temp);}}}return numCourses == 0;}
}

【LeetCode笔记】207. 课程表(Java、图、BFS、队列)相关推荐

  1. [Leetcode][第207题][JAVA][课程表][拓扑排序][DFS]

    [问题描述][中等] [解答思路] 1. 拓扑排序 复杂度分析 HashSet[] 数组 import java.util.HashSet; import java.util.LinkedList; ...

  2. 【LeetCode笔记】232. 用栈实现队列(Java、栈、队列)

    题目描述 经典题了,貌似现在面试也有点喜欢问,今天补补题! 要实现均摊时间复杂度O(1)噢 思路 & 代码 用两个栈来实现:输出栈 & 输入栈 输出栈 out:负责 pop.peek ...

  3. 【LeetCode笔记】406. 根据身高重建队列(Java、偏数学)

    文章目录 题目描述 思路 && 代码 二刷 题目描述 老阅读题了= =,第一遍看题的时候一脸懵逼 但其实代码就6行(嘿嘿) 思路 && 代码 先按照身高降序排,再按照人 ...

  4. 用java实现课程表_Java实现 LeetCode 207 课程表

    207. 课程表 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] ...

  5. [Leetcode][第111题][JAVA][BFS][二叉树的最小深度][BFS][递归]

    [问题描述][简单] [解答思路] 1. 递归 自下而上 基本情况/结束条件 : 叶子节点的定义是左孩子和右孩子都为 null 时叫做叶子节点 当 root 节点左右孩子都为空时,返回 1 当 roo ...

  6. [Leetcode][第104题][JAVA][二叉树的最大深度][递归][BFS]

    [问题描述][简单] [解答思路] 1. 递归 终止条件/基本情况 root ==null 递推关系 max(l,r)+1 时间复杂度:O(N) 空间复杂度:O(height) class Solut ...

  7. Leetcode刷题 225题:用队列实现栈(基于Java和c++两种语言)

    ** Leetcode刷题 225题:用队列实现栈(基于Java和c++两种语言) ** 题目: 使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top( ...

  8. [Leetcode][第841题][JAVA][钥匙和房间][DFS][BFS]

    [问题描述][中等] [解答思路] 当 xx 号房间中有 yy 号房间的钥匙时,我们就可以从 xx 号房间去往 yy 号房间.如果我们将这 nn 个房间看成有向图中的 nn 个节点,那么上述关系就可以 ...

  9. LeetCode—207. 课程表

    207. 课程表 题目描述:你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 . 在选修某些课程之前需要一些先修课程. 先修课程按数组 prerequisi ...

  10. python自动排课表_LeetCode 207. 课程表 | Python

    207. 课程表 题目 你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 . 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ...

最新文章

  1. CDMA模块上网设置的过程
  2. 推荐8款有趣实用的软件,建议你先收藏,总有一天你会用到
  3. 线程池 ManualResetEvent
  4. stm32串口学习(一)
  5. python数据结构_(字典)大O性能_学习笔记(3)
  6. 非结构化WEB数据库与图书馆多媒体信息资源的组织利用
  7. Python中append()和extend方法的使用和区别
  8. Python之数据分析(Numpy数据可视化:等高线图、热力图、饼图)
  9. 一些常用的WebServices 天气,IP,邮编,Email,火车时刻表,股票 等等
  10. Vue实现打印机接口打印组件
  11. mysql webmail ubuntu12.04 imap_如何在Ubuntu 18.04 LTS上安装最新的Roundcube Webmail
  12. android技术交流群 付费群,QQ群付费入群功能停止服务是怎么回事?QQ付费入群功能停止服务详情一览[多图]...
  13. 常见的内存错误java_Java虚拟机常见内存溢出错误汇总,Java中常见的坑看了可以少走点弯路...
  14. WPS当中封面图如何快速对齐下划线
  15. 第一模块 jdk与jre、==与equals、Math.round(-1.5)、 String、操作字符串的类、字符串反转、抽象类必须要有抽象方法吗、普通类和抽象类、BIO NIO AIO
  16. 关于DVDScr, Screener,TS, TC等常见术语
  17. 基于Redis的消息中心缓存搭建
  18. 华科再次拿下华为“天才少年”最高薪!201万给到通信应届博士生
  19. 关于搭建Vue项目的顺序及遇到的问题
  20. INTRINS.H的函数

热门文章

  1. data为long 怎么设置vue_vue基础之data
  2. qt显示rgba8888 如何改 frame_Qt开源作品17-IP地址输入控件
  3. python+OpenCV图像处理(十)霍夫变换简单图形检测
  4. JavaSE——常用类库(上)(泛型、Objects、Math、ArraysBigDecimal类)
  5. UG/Open API基础知识-语法1
  6. Retrofit学习入门
  7. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 6丨统计各专业学生人数【难度中等】
  8. Java消息服务~消息属性
  9. android applybatch,android – 使用applyBatch插入成千上万的联系人条目很慢
  10. linuxoracle查看用户权限_权限管理系统设计过程