LeetCode新编 207. 课程表

题干

你这个学期必须选修 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
}


猜你喜欢

转载自blog.csdn.net/weixin_49249294/article/details/108895004