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 ...
随机推荐
- thinkphp nginx 上配置 并解决get获取到数据现象
server { listen 80; server_name XXXX.funova.net XXX.funova.com; root /opt/newgm; index index.php; lo ...
- 下面的那一个不属于MVC模式中的对象?
下面的那一个不属于MVC模式中的对象? A. Model B. View C. Collection D. Controller 解答:C MVC是三个单词的缩写,分别为: 模型(Model),视图( ...
- 百度富文本编辑器UEditor报【类型"Uploader"同时存在】错误
错误信息: 类型“Uploader”同时存在.... 解决方案: 方法一:将UEditor的net文件夹下的Uploader.cs文件的生成操作属性默认是“编译”,只需要将这个文件的生成操作属性改为“ ...
- .NET学习笔记(1)
把 DataSet 绑定到 Repeater 控件 Repeater 控件用于显示重复的项目列表,这些项目被限制在该控件.Repeater 控件可被绑定到数据库表.XML 文件或者其他项目列表. 获取 ...
- vi 的使用,很详细
来源:鸟哥的Linux私房菜 网址:http://vbird.dic.ksu.edu.tw/linux_basic/0310vi_2.php
- 修改Chem 3D模型的化学键属性的方法有哪些
很多的用户在绘制化学图形过程中发现很多的图形都是立体结构的,这个时候就需要用Chem3D,它是ChemOffice的核心组件之一,在绘制立体模型和计算化学数据方面具有不可替代的作用.虽然ChemDra ...
- opencv2.4.9+VS2010配置
opencv2.4.9 https://pan.baidu.com/s/15b5bEY65R4CptayEYVAG4A 安装包路径:D:\文件及下载相关\文档\Tencent Files\845235 ...
- ajax 传递数组类型参数后台接收不到的问题
在做排序功能的时候需要将一个数组的数据传递到后台,(当时怎么没用json,如果用json就没有那么多的事情了),数据提交采用ajax! 先看代码 js: submitbtn: function () ...
- iis express worker process已停止工作
以管理员方式运行命令提示符工具,然后执行以下语句 netsh winsock reset 重启电脑
- Python计算地图上两点经纬度间的距离
处理地图数据时,经常需要用到两个地理位置间的距离.比如A点经纬度(110.0123, 23.32435),B点经纬度(129.1344,25.5465),求AB两点之间的距离.我们可以用haversi ...