现在你总共有 n 门课需要选,记为 0 到 n-1。

在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]

给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。

可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。

示例 1:

输入: 2, [[1,0]] 
输出: [0,1]
解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1] 。
示例 2:

输入: 4, [[1,0],[2,0],[3,1],[3,2]]
输出: [0,1,2,3] or [0,2,1,3]
解释: 总共有 4 门课程。要学习课程 3,你应该先完成课程 1 和课程 2。并且课程 1 和课程 2 都应该排在课程 0 之后。
     因此,一个正确的课程顺序是 [0,1,2,3] 。另一个正确的排序是 [0,2,1,3] 。
说明:

输入的先决条件是由边缘列表表示的图形,而不是邻接矩阵。详情请参见图的表示法。
你可以假定输入的先决条件中没有重复的边。
提示:

这个问题相当于查找一个循环是否存在于有向图中。如果存在循环,则不存在拓扑排序,因此不可能选取所有课程进行学习。
通过 DFS 进行拓扑排序 - 一个关于Coursera的精彩视频教程(21分钟),介绍拓扑排序的基本概念。
拓扑排序也可以通过 BFS 完成。

思路:拓扑排序

代码:

class Solution {

public int[] findOrder(int numCourses, int[][] prerequisites) {

List<Integer> lists[] = new ArrayList[numCourses];//记录某个节点可以到达的节点集合

int invalue[] = new int[numCourses];//记录每个节点的入度

for(int i=0;i<prerequisites.length;i++){

invalue[prerequisites[i][0]]++;

if(lists[prerequisites[i][1]]==null){

lists[prerequisites[i][1]] = new ArrayList<>();

}

lists[prerequisites[i][1]].add(prerequisites[i][0]);

}

Queue<Integer> queue = new LinkedList<>();

for(int i=0;i<numCourses;i++){

if(invalue[i]==0){

queue.add(i);

}

}

int result[] = new int[numCourses];

int count=0;

while(!queue.isEmpty()){

int size = queue.size();

while(size-->0){

int t = queue.poll();

result[count++]=t;

if(lists[t]==null) continue;

for(int i=0;i<lists[t].size();i++){

invalue[lists[t].get(i)]--;

if(invalue[lists[t].get(i)]==0){

queue.add(lists[t].get(i));

}

}

}

}

if(count==numCourses) return result;

else return new int[0];

}

}

Leetcode--210.课程表Ⅱ相关推荐

  1. LeetCode—210. 课程表 II

    210. 课程表 II 题目描述:现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1.给你一个数组 prerequisites ,其中 prerequisite ...

  2. LeetCode 210. 课程表 II(拓扑排序)

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

  3. leetcode *210. 课程表 II(拓补排序)(2020.5.17)

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

  4. Leetcode 210.课程表II

    Time: 20190903 Type: Medium 考察:拓扑排序 题目描述 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 , ...

  5. LeetCode 210. 课程表 II(Kahn)

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

  6. Leetcode 210. 课程表 II 解题思路及C++实现

    解题思路: 与第207题很像,多的是需要存储一个修读课程的可行解,所以在dfs函数内,当判断第i门课程不存在环时,需要将其push_back进数组cur中. 由于是用深度优先搜索的方法,所以存储在cu ...

  7. LeetCode 207. 课程表(拓扑排序)

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

  8. 207.课程表 | 210.课程表II(拓扑排序)

    207.课程表 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 . 在选修某些课程之前需要一些先修课程. 先修课程按数组 prerequisites 给出 ...

  9. 210. 课程表 II kahn求拓扑图算法

    210. 课程表 II 难度:中等 题目描述 解题思路 以前没有写过图的,但是有了解过拓扑排序,根据提示还有算法描述很容易就写出代码了.用栈和队列都行,如果用栈就是深度优先搜索,用队列就是广度优先搜索 ...

  10. leetcode 210. Course Schedule II | 210. 课程表 II(Java)

    题目 https://leetcode.com/problems/course-schedule-ii/ 题解 本题与 leetcode 207. Course Schedule 基本相同,代码只需要 ...

最新文章

  1. shiro 的session持久化
  2. tomcat基本使用,就是这么简单
  3. 当 K8s 集群达到万级规模,阿里巴巴如何解决系统各组件性能问题?
  4. After paper reading.......
  5. 高级C语言教程-编译链接调试
  6. 四屏带缩略图JS幻灯片
  7. db2有主键时默认hash分区_彻底搞懂 MySQL 分区!
  8. python字符串转义序列_Python | 忽略字符串中的转义序列
  9. 你以为PHP那么好自定义升级?
  10. Android中自定义水球
  11. SQL Server 2012 完全安装
  12. html自动跳转到锚点,html中的锚点
  13. BlockingQueue使用详解以及测试代码
  14. 一大早,分享一个好消息
  15. 银行软开开发篇[转]
  16. 2.1 matlab特殊矩阵(零矩阵、幺矩阵、单位矩阵、魔方矩阵、范德蒙德矩阵和希尔伯特矩阵)
  17. 英特尔处理器全部系列
  18. 鸿蒙空间命运法则,洪荒之终极人族
  19. asp dotnet core 从零开始创建一个 WebApi 服务
  20. 宝塔linux取消登录,宝塔面板如何关闭安全入口

热门文章

  1. LeetCode 1243. 数组变换
  2. LeetCode 109. 有序链表转换二叉搜索树(快慢指针+递归)
  3. 怎样切换git账号密码错误_git中多账号切换问题的解决方案(转)
  4. for循环利用可迭代对象与迭代器完成工作的本质
  5. 五个同事想计算他们的平均工资,但公司不让吐露薪资,如何实现?
  6. 什么是小样本学习?这篇综述文章用166篇参考文献告诉你答案
  7. 深入浅出排序学习:写给程序员的算法系统开发实践
  8. 论文浅尝 | 提取计数量词丰富知识库
  9. 海马体what where记忆推理模型
  10. 系统设计:github上学习如何设计大型系统的项目