210. 课程表 II
题目描述:现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi 。
例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1] 。
返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。如果不可能完成所有课程,返回 一个空数组 。
考察重点:DFS——深度优先搜索
func dfs2(rec [][]int, lenRec []int, flag []int, res *[]int, nowNum int) bool { //思路与p207一致,加入15,16行记录遍历顺序if flag[nowNum] == -1 {return false} else if flag[nowNum] == 1 {return true}flag[nowNum] = -1for i := 0; i < lenRec[nowNum]; i++ {if !dfs2(rec, lenRec, flag, res, rec[nowNum][i]) {return false}}t1 := *res //t1为地址res中的值 //如果dfs2()中的参数是res []int,则append之后返回的新数组与参数地址不同,则无法通过将res放在参数中来修改它*res = append(t1, nowNum) //所以这里存放的是res *[]int,将res修改完成后,把地址res下存放的值,替换为append返回值flag[nowNum] = 1return true
}
func FindOrder(numCourses int, prerequisites [][]int) []int {var rec [][]intfor i := 0; i < 10; i++ {t := make([]int, numCourses)rec = append(rec, t)}lenRec := make([]int, numCourses)flag := make([]int, numCourses)res := &[]int{}for i := 0; i < len(prerequisites); i++ {temp := prerequisites[i][0]rec[temp][lenRec[temp]] = prerequisites[i][1]lenRec[temp]++}for i := 0; i < numCourses; i++ {if flag[i] == 0 {if !dfs2(rec, lenRec, flag, res, i) {return []int{} //如果有环,返回空数组}}}return *res //返回地址res下存放的值
}