思路
首先要完全理解题意,这道题的[a,b]并不是b满足了a就可以真正的学习a这门课了,因为a还有可能需要其他选修课的条件。类似下图。
这题的思路在于使用合适的数据结构来存储,这里用hash表来存储如果1这门课可以修了之后,可以让哪些课所需条件–。定义一个每个课所需要的条件的数组。关键就在于当条件都满足也就是所需条件为0的时候,应该让他发挥他的作用。
这里有一个需要注意的点,那就是当我第一次遍历的时候,前面的递归可能已经完成了它的使命,当我顺便遍历到完成使命的课程的时候发现是0导致我再一次让它完成他的使命,也就是重复完成使命,重复操作需要避免。这里需要创建一个用来标记的数组来表示它有没有被重复使用。
代码示例
func canFinish(numCourses int, prerequisites [][]int) bool {inDegree:=make([]int,numCourses)m:=make(map[int][]int)for i:=0;i<len(prerequisites);i++{m[prerequisites[i][1]]=append(m[prerequisites[i][1]],prerequisites[i][0])inDegree[prerequisites[i][0]]++}flag:=make([]bool,numCourses)var rec func(nums []int)rec=func(nums []int){for i:=0;i<len(nums);i++{inDegree[nums[i]]--if inDegree[nums[i]]==0 {flag[nums[i]]=truerec(m[nums[i]])}}}for i:=0;i<len(inDegree);i++{if inDegree[i]==0 && flag[i]==false{flag[i]=truerec(m[i])}}for i:=0;i<len(inDegree);i++{if inDegree[i]>0{return false}}return true
}