题目:
现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi 。
- 例如,想要学习课程
0,你需要先完成课程1,我们用一个匹配来表示:[0,1]。
返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。如果不可能完成所有课程,返回 一个空数组 。
算法:
方法一:和课程表I方法一样的,只是多了返回路径
func findOrder(numCourses int, prerequisites [][]int) []int {
inDegree := make([]int, numCourses)
adjency := make([][]int, numCourses)
for i := range prerequisites {
inDegree[prerequisites[i][0]] ++
adjency[prerequisites[i][1]] = append(adjency[prerequisites[i][1]], prerequisites[i][0])
}
queue := make([]int, 0)
count := 0
ans := make([]int, 0 )
for i := range inDegree {
if inDegree[i] == 0 {
queue = append(queue, i)
count ++
}
}
// fmt.Println(inDegree, queue)
for len(queue) != 0 {
node := queue[0]
queue = queue[1:]
ans = append(ans, node)
for _, neighbor := range adjency[node] {
inDegree[neighbor] --
if inDegree[neighbor] == 0 {
queue= append(queue, neighbor)
count ++
}
}
}
if count != numCourses {
return nil
}
return ans
}