思路
??首先要完全理解題意,這道題的[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
}