210.课程表 II

70 阅读1分钟

题目:
现在你总共有 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
}