其他分享
首页 > 其他分享> > [LeetCode] 207. Course Schedule

[LeetCode] 207. Course Schedule

作者:互联网

课程表。题意是现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程0,你需要先完成课程1,我们用一个匹配来表示他们: [0,1]。给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习。例子,

Example 1:

Input: 2, [[1,0]] 
Output: true
Explanation: There are a total of 2 courses to take. 
             To take course 1 you should have finished course 0. So it is possible.

Example 2:

Input: 2, [[1,0],[0,1]]
Output: false
Explanation: There are a total of 2 courses to take. 
             To take course 1 you should have finished course 0, and to take course 0 you should
             also have finished course 1. So it is impossible.

典型的拓扑排序题目。拓扑排序又称之为有向无环图(DAG)。拓扑排序的定义在这里就不赘述了。这个题目有多种做法,此处我解释一下BFS的思路。

首先为所有课程创建一个入度表indegree,遍历所有的课程。所有课程的prerequisites都以一个pair[0, 1]表示(0的先修课程是1),所以遍历所有的pair[0],建立所有课程的入度表。此时再遍历这个入度表,将入度表中所有为0(没有先修课程)的元素加入一个队列。遍历这个队列,每弹出一个元素cur,就减去一门课res--,去prerequisites中看是否有其他课程pair[0]的先修课程是cur,若有,则在入度表里面找到这个pair[0]并减1。如果这个pair[0]也被减到入度为0了,则把他加入队列继续查找,看这个pair[0]是否是别的课的先修课。最后会跳出while循环,跳出的时候判断是不是所有课程res都遍历完了。

时间O(V + E)

空间O(n)

 1 class Solution {
 2     public boolean canFinish(int numCourses, int[][] prerequisites) {
 3         int[] indegree = new int[numCourses];
 4         int res = numCourses;
 5         for (int[] pair : prerequisites) {
 6             indegree[pair[0]]++;
 7         }
 8 
 9         // 把所有入度为0的节点加入队列
10         // 入度为0说明没有先修课程
11         Queue<Integer> queue = new LinkedList<>();
12         for (int i = 0; i < indegree.length; i++) {
13             if (indegree[i] == 0) {
14                 queue.offer(i);
15             }
16         }
17 
18         // 遍历所有入度为0的课程
19         while (!queue.isEmpty()) {
20             int pre = queue.poll();
21             res--;
22             // 看是否有其他课程的先修课程是pre
23             for (int[] pair : prerequisites) {
24                 if (pair[1] == pre) {
25                     indegree[pair[0]]--;
26                     if (indegree[pair[0]] == 0) {
27                         queue.offer(pair[0]);
28                     }
29                 }
30             }
31         }
32         return res == 0;
33     }
34 }

 

标签:207,course,int,indegree,Course,课程,先修,pair,LeetCode
来源: https://www.cnblogs.com/aaronliu1991/p/12467256.html