207. Course Schedule
输入:课程数量n,每个课程的编号是0到n-1。课程学习的先后顺序用数组输入,例如[0,1]。要学习课程0,需要先学习课程1。
输出:如果可以学习完所有的课程,返回true,否则返回false。
分析:因为有些课程学习需要其他课程学习完才可以,这是拓扑排序的描述。我们可以根据数组对,建立一个有向图。方向是从前提课程指向能够到达的课程。需要从没有先决条件的课程i开始,接着课程i能到达的课程j入度减1。如果课程j的入度为0 ,那继续加入可学习队列。如此及不断向外扩大学习范围。可以用BFS或者DFS实现。
DFS实现:
public boolean canFinishV3(int numCourses, int[][] prerequisites) {int[] inDegree = new int[numCourses];boolean[] visited = new boolean[numCourses];List<List<Integer>> graph = new ArrayList<List<Integer>>(numCourses);for(int i=0;i<numCourses;i++){graph.add(new ArrayList<Integer>());}for(int i=0;i<prerequisites.length;i++){inDegree[prerequisites[i][0]]++;graph.get(prerequisites[i][1]).add(prerequisites[i][0]);}for(int i=0;i<numCourses;i++){if(visited[i]==false && inDegree[i]==0){if(!bfs(graph,visited,inDegree,i)){return false;}}}for(int i=0;i<numCourses;i++){if(visited[i]==false) return false;}return true;}private boolean bfs(List<List<Integer>> graph,boolean[] visited,int[] inDegree,int index){if(visited[index]) return false;visited[index] = true;for(Integer toCourse : graph.get(index)){inDegree[toCourse]--;if(inDegree[toCourse]==0){if(!bfs(graph,visited,inDegree,toCourse)){return false;}}}return true;}
BFS实现
public boolean canFinishV2(int numCourses, int[][] prerequisites) {int[] inDegree = new int[numCourses];List<List<Integer>> graph = new ArrayList<List<Integer>>(numCourses);for (int i = 0; i < numCourses; i++) {graph.add(new ArrayList<Integer>());}for (int i = 0; i < prerequisites.length; i++) {inDegree[prerequisites[i][0]]++;graph.get(prerequisites[i][1]).add(prerequisites[i][0]);}Queue<Integer> queue = new LinkedList<Integer>();for (int i = 0; i < numCourses; i++) {if (inDegree[i] == 0) {queue.add(i);}}int count = 0;while (!queue.isEmpty()) {int course = queue.poll();count++;for (Integer toCourse : graph.get(course)) {inDegree[toCourse]--;if (inDegree[toCourse] == 0) {queue.add(toCourse);}}}return count == numCourses;}
这道题目与210的区别是210要求输入学习路线。
207代码
210代码
207. Course Schedule相关推荐
- 207. Course Schedule 210. Course Schedule II
拓扑排序的问题 套路: 1. 初始化所有的节点的入度为零. 2. 遍历给定的输入要求. 维护一个indegree 的表.记录每个节点的入度. 维护map, 每个节点的后续节点 3. 得到这两个表以后开 ...
- 207. Course Schedule 课程表
你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 . 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他 ...
- leetcode 207. Course Schedule | 207. 课程表(Java)
题目 https://leetcode.com/problems/course-schedule/ 题解 这的道题思路,来源于数据结构中的 拓扑排序 问题,主要思路是,通过逐步遍历删除入度为 0 的节 ...
- [leetcode]207. Course Schedule课程表
在一个有向图中,每次找到一个没有前驱节点的节点(也就是入度为0的节点),然后把它指向其他节点的边都去掉,重复这个过程(BFS),直到所有节点已被找到,或者没有符合条件的节点(如果图中有环存在). /* ...
- leetcode 210. Course Schedule II | 210. 课程表 II(Java)
题目 https://leetcode.com/problems/course-schedule-ii/ 题解 本题与 leetcode 207. Course Schedule 基本相同,代码只需要 ...
- 继续过中等难度.0309
. 8 String to Integer (atoi) 13.9% Medium . 151 Reverse Words in a String 15.7% Mediu ...
- LeetCode 399. Evaluate Division--Python-DFS解法
题目地址:Evaluate Division - LeetCode Equations are given in the format A / B = k, where A and B are var ...
- LeetCode 所有题目总结
文章目录 做题注意事项 题目分类 1.位运算 2.字符串题型 3.TopK 问题--最大堆/最小堆 4.链表 5.动态规划 easy Medium hard 6.贪心 7.树 8.图 9.数学题 10 ...
- Depth-first Search深度优先搜索专题4
576. Out of Boundary Paths 思路:这道题目难倒了我.最直接的思路是暴力搜索.要注意的问题1是需要仔细观察Example2,轨迹不同意思是可以从A点到B点,再从B点到A点也可以 ...
最新文章
- 日期控件的点击事件,在js中添加callback属性,不在html中直接添加
- Kafka系列2-producer和consumer报错
- “QMYSQL: Unable to allocate a MYSQL object“ 解决方法
- java 日志使用_Java日志正确使用姿势
- php中Session的生成机制、回收机制和存储机制探究
- Struts2基础知识
- jpadao层继承什么_实木复合地板特点是什么
- 单例模式(学习小记)
- 替换Tomcat在浏览器地址栏中的ico图标
- telnet 命令参数及其应用方式
- 2022-2027年中国新能源车电控电机市场竞争态势及行业投资前景预测报告
- Unity3D场景制作基本操作
- 请冷静地对待手中的EOS——EOS数据分析
- java泛型笔记2--上界通配符
- 大球分析系统_走地大球分析系统app
- 【C++】%c,%s分别代表什么意思
- 信源编码技术作业(1)绘制、分析清浊音频谱图
- 安兔兔电脑ssd测试软件,安兔兔SSD测试软件测评,威钰战国NVMe SSD
- 微软Windows 11正式发布!(文末送书)
- 成功与失败——《异类》读后感
热门文章
- 每次新建Android项目都报样式找不到的错误?
- 排错“未能封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配”...
- 【Codeforces #130 Div2】Solutions
- 父亲的忠告:把孩子培养成普通人
- C# 的Delegate(委托)
- android 加载显示富文本——TextView显示富文本和WebView显示富文本,WebView显示图片适配屏幕宽度
- vue router 常用操作 重定向 redirect
- js 判断 浏览器 是否为 微信 浏览器
- 宝塔面板 mongodb 允许外网访问
- linux的yum详解,Linux之YUM 详解