你这个学期必须选修 `numCourse` 门课程,记为 `0` 到 `numCourse-1` 。 在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:`[0,1]` 给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习? **示例 1:** ```js 输入: 2, [[1,0]] 输出: true 解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。 ``` **示例 2:** ```js 输入: 2, [[1,0],[0,1]] 输出: false 解释: 总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。 ``` **提示:** - 输入的先决条件是由 **边缘列表** 表示的图形,而不是 邻接矩阵 - 你可以假定输入的先决条件中没有重复的边 - `1 <= numCourses <= 10^5` 附赠leetcode地址:[leetcode](https://leetcode-cn.com/problems/course-schedule/solution/tu-jie-ke-cheng-biao-wen-ti-by-user7746o/)
Activity
7777sea commentedon Jun 18, 2020
sisterAn commentedon Jun 18, 2020
这是一道经典的拓扑排序问题,所谓拓扑排序,举个例子:
比如吃自助火锅,有一套约定俗成的流程,首先先打开包装,然后放入粉、佐料、菜,然后在加水,最后盖上盖子;这是有一套先后顺序的,你不可能没打开包装就放佐料,也可以说这是有一套依赖关系的,盖盖子依赖加水,加水依赖放入粉、佐料、菜,继而依赖打开包装
这种关系通常使用有向图来表示,如果这套流程能够成功的帮助你最后吃到火锅(无环),那这种依赖顺序就是拓扑排序,即拓扑排序是针对有向无环图的
解法:广度优先遍历
例如:
所以我们可以使用 邻接表 来表示有向图中各个节点的依赖关系,同时维护一个入度表,则入度表中入度为
0的节点所表示的课程是可以立即开始学习的(没有先决条件条件或先觉条件已完成)那么这题就很简单了:
0的节点放入队列中numCourse —(学习该课程),然后将将依赖该课程所有临接节点的入度减11后节点入度为0,则该课程又是可立即学习课程,将该节点添加到队尾1后节点入度不为0,则继续遍历下一节点numCourses === 0(所有课程是否全部学习结束)即可复杂度分析:
leetcode