LeetCode 797:DAG路径全解析

LeetCode 797:DAG中所有路径

问题描述

LeetCode 797题“所有可能的路径”要求在有向无环图(DAG)中,从节点 0 到节点 n-1 的所有路径。图的表示形式为邻接表,其中 graph[i] 是节点 i 的直接邻居列表。

解决思路

使用深度优先搜索(DFS)遍历图的所有可能路径。由于题目保证图为有向无环图(DAG),无需处理环的情况。

算法步骤

初始化一个空列表 result 存储所有路径,一个临时列表 path 记录当前路径。

从节点 0 开始递归调用DFS函数,每次访问节点时将其加入 path 中。当到达目标节点 n-1 时,将当前 path 加入 result

回溯时从 path 中移除当前节点,确保其他路径的探索不受影响。

代码实现

class Solution:
    def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]:
        result = []
        n = len(graph)
        
        def dfs(node, path):
            if node == n - 1:
                result.append(path.copy())
                return
            for neighbor in graph[node]:
                path.append(neighbor)
                dfs(neighbor, path)
                path.pop()
        
        dfs(0, [0])
        return result

复杂度分析

  • 时间复杂度:O(2^N * N),其中 N 为节点数。最坏情况下每个节点有两个选择(如二叉树结构),路径长度为 O(N)。
  • 空间复杂度:O(N),递归栈深度和临时路径 path 的空间占用。

示例

输入:graph = [[1,2],[3],[3],[]]
输出:[[0,1,3],[0,2,3]]
解释:从节点 0 出发,有两条路径可达节点 3。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值