LeetCode 210. Course Schedule II
2020-05-31 06:34:26 # leetcode # core problems

Problem

207. Course Schedule

1. 题目简述

一共有n门课程需要修,分别是从0到n-1。有些课程需要进行先修课程,我们以数组的形式给出,例如:[0, 1],就是说如果要修课,必须要上过1课。

现在给出numCourses门课程,和一个prerequisites数组,求给出一种拓扑排序的方式。

2. 算法思路

参考解法:花花酱LeetCode

LeetCode 207. Course Schedule类似,基本一致,这里不再赘述,直接上解析。

BFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
// BFS
int[] inDegree = new int[numCourses];
Stack<Integer> zeroDegreeVertex = new Stack();
int res[] = new int[numCourses];
ArrayList<Integer>[] relations = new ArrayList[numCourses];

for (int i = 0; i < numCourses; i++) {
relations[i] = new ArrayList();
}

for (int[] prerequisite : prerequisites) {
inDegree[prerequisite[0]]++;
relations[prerequisite[1]].add(prerequisite[0]);
}

for (int i = 0; i < numCourses; i++) {
if (inDegree[i] == 0) {
zeroDegreeVertex.push(i);
}
}

int index = 0;
while (!zeroDegreeVertex.isEmpty() && index != numCourses) {
res[index] = zeroDegreeVertex.pop();
for (int vertex : relations[res[index]]) {
inDegree[vertex]--;
if (inDegree[vertex] == 0) {
zeroDegreeVertex.push(vertex);
}
}
index++;
}

if (index != numCourses) {
return new int[0];
}

return res;
}
}

DFS + backtracking

DFS优化