LeetCode207、210 课程表(图 dfs 拓扑排序)

文章讲述了两种解决方案,分别是`classSolution`中的深度优先搜索方法对课程表进行拓扑排序,以及`findOrder`版本,确保先决课程完成后添加到结果中。作者展示了如何利用依赖关系图进行遍历,以判断是否存在环并确定课程顺序。
摘要由CSDN通过智能技术生成

官方题解主要思想是使用dfs进行拓扑排序。

课程表

class Solution:
    def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
        edges = collections.defaultdict(list) 
        visited = [0] * numCourses # 将列表初始化为numCourses个0
        # result = []
        valid = True

        for info in prerequisites:
            edges[info[1]].append(info[0]) # info[1]是哪些课程的依赖(先决条件)    
                
        def dfs(u: int):
            nonlocal valid
            visited[u] = 1
            for v in edges[u]:
                if visited[v] == 0:
                    dfs(v)
                    if not valid:
                        return
                elif visited[v] == 1:
                    valid = False
                    return
            visited[u] = 2
            # result.append(u)
        
        for i in range(numCourses):
            if valid and not visited[i]:
                dfs(i)
        
        return valid

课程表二

class Solution:
    def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:
        edges = collections.defaultdict(list)
        visited = [0]*numCourses
        result = []
        valid =True

        for info in prerequisites:
            edges[info[1]].append(info[0])

        def dfs(u):
            nonlocal valid
            visited[u]=1
            for v in edges[u]:
                if visited[v]==0:
                    dfs(v)
                elif visited[v]==1:
                    valid=False
                    return 

            visited[u]=2
            result.append(u)

        for i in range(numCourses):
            if valid and not visited[i]:
                dfs(i)

        if valid==True:
            result.reverse()
            return result
        else:
            return []  
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值