思路
首先要完全理解题意,这道题的[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]]=true
rec(m[nums[i]])
}
}
}
for i:=0;i<len(inDegree);i++{
if inDegree[i]==0 && flag[i]==false{
flag[i]=true
rec(m[i])
}
}
for i:=0;i<len(inDegree);i++{
if inDegree[i]>0{
return false
}
}
return true
}