【LeetCode笔记】207. 课程表(Java、图、BFS、队列)
文章目录
- 题目描述
- 思路 && 代码
- 二刷
题目描述
- 刷的第一道图相关的题,简直考古
- 要复习一下拓扑、邻接矩阵之类的知识啦
思路 && 代码
- 前置课程看成入度,后置课程看成出度
- 对于入度,只需要记录有多少即可。
- 对于出度,逐个记录下来(用于完成后,更新对应结点的入度)
- 初始化:从入度为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、队列)相关推荐
- [Leetcode][第207题][JAVA][课程表][拓扑排序][DFS]
[问题描述][中等] [解答思路] 1. 拓扑排序 复杂度分析 HashSet[] 数组 import java.util.HashSet; import java.util.LinkedList; ...
- 【LeetCode笔记】232. 用栈实现队列(Java、栈、队列)
题目描述 经典题了,貌似现在面试也有点喜欢问,今天补补题! 要实现均摊时间复杂度O(1)噢 思路 & 代码 用两个栈来实现:输出栈 & 输入栈 输出栈 out:负责 pop.peek ...
- 【LeetCode笔记】406. 根据身高重建队列(Java、偏数学)
文章目录 题目描述 思路 && 代码 二刷 题目描述 老阅读题了= =,第一遍看题的时候一脸懵逼 但其实代码就6行(嘿嘿) 思路 && 代码 先按照身高降序排,再按照人 ...
- 用java实现课程表_Java实现 LeetCode 207 课程表
207. 课程表 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] ...
- [Leetcode][第111题][JAVA][BFS][二叉树的最小深度][BFS][递归]
[问题描述][简单] [解答思路] 1. 递归 自下而上 基本情况/结束条件 : 叶子节点的定义是左孩子和右孩子都为 null 时叫做叶子节点 当 root 节点左右孩子都为空时,返回 1 当 roo ...
- [Leetcode][第104题][JAVA][二叉树的最大深度][递归][BFS]
[问题描述][简单] [解答思路] 1. 递归 终止条件/基本情况 root ==null 递推关系 max(l,r)+1 时间复杂度:O(N) 空间复杂度:O(height) class Solut ...
- Leetcode刷题 225题:用队列实现栈(基于Java和c++两种语言)
** Leetcode刷题 225题:用队列实现栈(基于Java和c++两种语言) ** 题目: 使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top( ...
- [Leetcode][第841题][JAVA][钥匙和房间][DFS][BFS]
[问题描述][中等] [解答思路] 当 xx 号房间中有 yy 号房间的钥匙时,我们就可以从 xx 号房间去往 yy 号房间.如果我们将这 nn 个房间看成有向图中的 nn 个节点,那么上述关系就可以 ...
- LeetCode—207. 课程表
207. 课程表 题目描述:你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 . 在选修某些课程之前需要一些先修课程. 先修课程按数组 prerequisi ...
- python自动排课表_LeetCode 207. 课程表 | Python
207. 课程表 题目 你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 . 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ...
最新文章
- CDMA模块上网设置的过程
- 推荐8款有趣实用的软件,建议你先收藏,总有一天你会用到
- 线程池 ManualResetEvent
- stm32串口学习(一)
- python数据结构_(字典)大O性能_学习笔记(3)
- 非结构化WEB数据库与图书馆多媒体信息资源的组织利用
- Python中append()和extend方法的使用和区别
- Python之数据分析(Numpy数据可视化:等高线图、热力图、饼图)
- 一些常用的WebServices 天气,IP,邮编,Email,火车时刻表,股票 等等
- Vue实现打印机接口打印组件
- mysql webmail ubuntu12.04 imap_如何在Ubuntu 18.04 LTS上安装最新的Roundcube Webmail
- android技术交流群 付费群,QQ群付费入群功能停止服务是怎么回事?QQ付费入群功能停止服务详情一览[多图]...
- 常见的内存错误java_Java虚拟机常见内存溢出错误汇总,Java中常见的坑看了可以少走点弯路...
- WPS当中封面图如何快速对齐下划线
- 第一模块 jdk与jre、==与equals、Math.round(-1.5)、 String、操作字符串的类、字符串反转、抽象类必须要有抽象方法吗、普通类和抽象类、BIO NIO AIO
- 关于DVDScr, Screener,TS, TC等常见术语
- 基于Redis的消息中心缓存搭建
- 华科再次拿下华为“天才少年”最高薪!201万给到通信应届博士生
- 关于搭建Vue项目的顺序及遇到的问题
- INTRINS.H的函数
热门文章
- data为long 怎么设置vue_vue基础之data
- qt显示rgba8888 如何改 frame_Qt开源作品17-IP地址输入控件
- python+OpenCV图像处理(十)霍夫变换简单图形检测
- JavaSE——常用类库(上)(泛型、Objects、Math、ArraysBigDecimal类)
- UG/Open API基础知识-语法1
- Retrofit学习入门
- 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 6丨统计各专业学生人数【难度中等】
- Java消息服务~消息属性
- android applybatch,android – 使用applyBatch插入成千上万的联系人条目很慢
- linuxoracle查看用户权限_权限管理系统设计过程