题干
你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。
在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]
给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/course-schedule
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
func canFinish(numCourses int, prerequisites [][]int) bool {
var (
i int
visitedMap = map[int]bool{}
reqingMap = map[int]bool{}
reqMap = map[int][]int{}
)
for i = 0; i < len(prerequisites); i++ {
reqMap[prerequisites[i][0]] = append(reqMap[prerequisites[i][0]], prerequisites[i][1])
}
for i = 0; i < numCourses; i++ {
if !learnCourse(i, visitedMap, reqingMap, reqMap) {
return false
}
}
return true
}
func learnCourse(i int, visitedMap, reqingMap map[int]bool, reqMap map[int][]int) bool {
if visitedMap[i] {
return true
}
reqingMap[i] = true
if _, exists := reqMap[i]; exists {
for j := 0; j < len(reqMap[i]); j++ {
if visitedMap[reqMap[i][j]] {
continue
}
if reqingMap[reqMap[i][j]] {
return false
}
if !learnCourse(reqMap[i][j], visitedMap, reqingMap, reqMap) {
return false
}
}
}
visitedMap[i] = true
return true
}