207. 课程表

思路

  首先要完全理解题意,这道题的[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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值