LeetCode:课程表【207】
LeetCode:课程表【207】
题目描述
现在你总共有 n 门课需要选,记为 0
到 n-1
。
在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]
给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习?
示例 1:
- 输入: 2, [[1,0]]
- 输出: true
- 解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。
示例 2:
- 输入: 2, [[1,0],[0,1]]
- 输出: false
- 解释: 总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。
说明:
- 输入的先决条件是由边缘列表表示的图形,而不是邻接矩阵。详情请参见图的表示法。
- 你可以假定输入的先决条件中没有重复的边。
题目分析
我们做这道题之前,需要先理解一个概念,就是拓扑排序。可以先参看这篇文章算法:拓扑排序。
如果我们已经理解了拓扑排序,那么这道题相对来说就比较简单了。这道题的核心点是判断有向图是否有环。
存在下面这种情况的就返回FALSE:
拓扑排序算法如何判断是否有环?
如上图的右半部分所示,首先黑色是节点的默认颜色,我们把访问到的节点标记为红色,在遇到出度为0的第一个节点时,我们将它标记为蓝色,最后所有的节点都会被染成蓝色,说明这是一个合法的拓扑图。
但是,在有环路的情况下,无论如何都无法到达出度为0的节点,当所有的黑色节点都变成红色后,还没有出现一个蓝色,那说明就是有环。
所以,我们把黑色表示为0,蓝色表示为1,红色表示为2,遇到黑色节点很正常,遇到蓝色节点也很正常(两者都是正常的拓扑排序环节),但是当我们遇到红色节点的时候说明遇到环路。
好了,说到这里,我觉得已经很清楚了,实现细节请看代码。
Java题解
- class Solution {
- public boolean canFinish(int numCourses, int[][] prerequisites) {
- ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
- for(int i=0;i<numCourses;i++)
- graph.add(new ArrayList<>());
- for(int i=0;i<prerequisites.length;i++)
- {
- int course = prerequisites[i][0];
- int pcourse = prerequisites[i][1];
- graph.get(course).add(pcourse);
- }
- int[] visited = new int[numCourses];
- for(int i=0;i<numCourses;i++)
- if(DFS(i,graph,visited))
- return false;
- return true;
- }
- public boolean DFS(int curr,ArrayList<ArrayList<Integer>> graph,int[] visited)
- {
- //递归结束条件
- if(visited[curr]==1)//这个节点已经被访问
- return true;
- if(visited[curr]==2)//这个节点没有被访问
- return false;
- //业务逻辑处理
- visited[curr]=1;//表示正在访问
- for(int id:graph.get(curr))
- if(DFS(id,graph,visited))
- return true;
- visited[curr]=2;//表示已经访问
- return false;
- }
- }
LeetCode:课程表【207】的更多相关文章
- leetcode.图.207课程表-Java
1. 具体题目 现在你总共有 n 门课需要选,记为 0 到 n-1.在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1].给定 ...
- 【LeetCode】207. Course Schedule 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/course-s ...
- 【LeetCode】207. Course Schedule (2 solutions)
Course Schedule There are a total of n courses you have to take, labeled from 0 to n - 1. Some cours ...
- 【leetcode】207. Course Schedule
题目如下: There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have ...
- LeetCode周赛#207
5519. 重新排列单词间的空格 #字符串 #模拟 题目链接 题意 给定字符串text,该字符串由若干被空格包围的单词组成,也就说两个单词之间至少存在一个空格.现要你重新排列空格,使每对相邻单词间空格 ...
- Leetcode 课程表 C++ 图的深度搜索和广度搜索练习
广度搜索(degree) struct GraphNode{ int label; vector<GraphNode*> neighbours; GraphNode(int x):labe ...
- 【刷题-LeetCode】207. Course Schedule
Course Schedule There are a total of numCourses courses you have to take, labeled from 0 to numCours ...
- [LeetCode] 207. Course Schedule 课程清单
There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have prereq ...
- [LeetCode] Course Schedule 课程清单
There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...
随机推荐
- dedecms安全篇:织梦文件夹目录权限设置
织梦各个目录安全详解 做织梦(dedecms)网站安全必看1.a 因为是静态目录,并且在要生成HTML的,所以拒绝脚本执行 允许写入2.data 因为是缓存等,所以充许写入,但是因为这里面 ...
- URL编码,空格和+
下表中列出了一些URL特殊符号及编码 + URL 中+号表示空格 %2B 空格 URL中的空格可以用+号或者编码 %20 / 分隔目录和子目录 %2F ? 分隔实际的URL和参数 %3F % 指定特殊 ...
- petrozavodsk summer 2018 游记&&总结
day0: 出发前训了一场比较水bapc2017保持手感(恢复信心),成功AK了,不过罚时略高.然后三人打车从紫金港到杭州东站,坐高铁到上海虹桥,再坐机场快线到浦东机场(傻乎乎的jsb帮爸爸付了钱,然 ...
- SurvivalShooter学习笔记(六.玩家生命)
需求: 玩家有初始生命: 被敌人攻击后:掉血,播放受击音效,红屏(用UI图片做)闪烁提示,UI面板刷新生命 直至死亡:死亡播放死亡音效,游戏结束: 1.变量: 玩家生命 public int star ...
- 浅述python中range()函数的用法
函数用法说明: 用法一:range(m) 输出: [0,1,...,m-1](从0到m-1的一个list,不包括m) 示例: 用法二:range(m,n),m<n 输出:[m,m+1,..,n- ...
- Google I/O 2013 – Volley: Easy, Fast Networking for Android
1.什么是volley Volley是Ficus Kirpatrick在Gooogle I/O 2013发布的一个处理和缓存网络请求的库,能使网络通信更快,更简单,更健壮.Volle ...
- docker 中安装 FastDFS 总结
如题,参考各资料后,安装FastDFS总结.基于已有docker镜像 https://hub.docker.com/r/luhuiguo/fastdfs/ docker pull luhuiguo/f ...
- iOS7下status bar相关问题的解决方法
转载自:http://blog.csdn.net/volcan1987/article/details/14227313 iOS7里status bar的实现跟iOS6下有写不一样,前段时间碰到了这个 ...
- DTD的学习和理解
看log4j的官方文档,上面说提供了XML格式的配置,但是没有XML具体示例.发现文档中说的是一个DTD文档,但我根本不知道DTD是什么,于是就简单了解一下.顺带做一下笔记. 注:结合笔记看log4j ...
- 史上最全Vim快捷键键位图 -- 入门到进阶
文章欢迎转载,但转载时请保留本段文字,并置于文章的顶部 作者:卢钧轶(cenalulu) 本文原文地址:http://cenalulu.github.io/linux/all-vim-cheatshe ...