题目描述
思路
代码

leetcode daily 797. 所有可能的路径

August 25, 2021

题目描述

给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)

二维数组的第 i 个数组中的单元都表示有向图中 i 号节点所能到达的下一些节点,空就是没有下一个结点了。

译者注:有向图是有方向的,即规定了 a→b 你就不能从 b→a 。

 

示例 1:



输入:graph = [[1,2],[3],[3],[]]
输出:[[0,1,3],[0,2,3]]
解释:有两条路径 0 -> 1 -> 3 和 0 -> 2 -> 3
示例 2:



输入:graph = [[4,3,1],[3,2,4],[3],[4],[]]
输出:[[0,4],[0,3,4],[0,1,3,4],[0,1,2,3,4],[0,1,4]]
示例 3:

输入:graph = [[1],[]]
输出:[[0,1]]
示例 4:

输入:graph = [[1,2,3],[2],[3],[]]
输出:[[0,1,2,3],[0,2,3],[0,3]]
示例 5:

输入:graph = [[1,3],[2],[3],[]]
输出:[[0,1,2,3],[0,3]]
 

提示:

n == graph.length
2 <= n <= 15
0 <= graph[i][j] < n
graph[i][j] != i(即,不存在自环)
graph[i] 中的所有元素 互不相同
保证输入为 有向无环图(DAG)

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/all-paths-from-source-to-target
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

给定图为有向无环图, 求从开始节点到结束节点的所有路径,可以考虑用回溯

  • 维护一条当前路径
  • 将当前节点 A 加入到路径,并深搜 A 的直接相邻节点 B, 依次进行
  • 当前路径满足条件时,将当前路径的拷贝保存
  • 遇到 A 为叶子节点时,即表现为 A 的邻接边为空时,进行回溯,将 A 从当前路径 pop

代码

/**
 * @param {number[][]} graph
 * @return {number[][]}
 */
var allPathsSourceTarget = function (graph) {
  const allPaths = [],
    curPath = [];

  dfs(0, curPath);

  return allPaths;

  function dfs(source, curPath) {
    curPath.push(source);

    if (source === graph.length - 1) {
      allPaths.push(curPath.slice());
    }

    for (let next of graph[source]) {
      dfs(next, curPath);
    }

    curPath.pop();
  }
};
  • 时间复杂度: $O(N * 2 ^ N)$, N 为节点数,因为要遍历共 2 ^ N 条路径,每条路径有 N 个节点,因此时间复杂度为 $O(N * 2 ^ N)$
  • 空间复杂度: $O(N)$, N 为节点数

feiker 少年起而行之