[LeetCode] 797. All Paths From Source to Target
Given a directed acyclic graph (DAG) of n
nodes labeled from 0 to n - 1, find all possible paths from node 0
to node n - 1
, and return them in any order.
The graph is given as follows: graph[i]
is a list of all nodes you can visit from node i
(i.e., there is a directed edge from node i
to node graph[i][j]
).
Example 1:
Input: graph = [[1,2],[3],[3],[]] Output: [[0,1,3],[0,2,3]] Explanation: There are two paths: 0 -> 1 -> 3 and 0 -> 2 -> 3.
Example 2:
Input: graph = [[4,3,1],[3,2,4],[3],[4],[]] Output: [[0,4],[0,3,4],[0,1,3,4],[0,1,2,3,4],[0,1,4]]
Example 3:
Input: graph = [[1],[]] Output: [[0,1]]
Example 4:
Input: graph = [[1,2,3],[2],[3],[]] Output: [[0,1,2,3],[0,2,3],[0,3]]
Example 5:
Input: graph = [[1,3],[2],[3],[]] Output: [[0,1,2,3],[0,3]]
Constraints:
n == graph.length
2 <= n <= 15
0 <= graph[i][j] < n
graph[i][j] != i
(i.e., there will be no self-loops).- The input graph is guaranteed to be a DAG.
所有可能的路径。
给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)
graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/all-paths-from-source-to-target
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这个题是一道比较典型的把回溯 backtracking 应用到图的题目。既然是是找 all possible paths,所以会想到类似 DFS/backtracking 的思路。面试遇到了不能做不出来啊。。。(# ̄~ ̄#)
这个题给的是 array of array,题意不是很直观,我这里解释一下。比如题目中给的例子一,意思是 0 可以连到 1,2;1 可以连接到 3;2 可以连接到 3;3 不能连到任何点(其实3也就是路径的终点了)。base case 是当前遍历到 graph 里面的最后一个节点,则把当前 list 的结果加入结果集;其他部分则是跟其他经典的回溯类型的题没有区别。注意因为题目给的是有向无环图,尤其是无环,就保证了无论你从哪个节点开始遍历,都不会重复遍历到任何一个节点,所以我们在这里就不需要一个额外数组记录某个节点是否被访问过了。
时间O(n)
空间O(n)
Java实现
1 class Solution { 2 public List<List<Integer>> allPathsSourceTarget(int[][] graph) { 3 List<List<Integer>> res = new ArrayList<>(); 4 List<Integer> path = new ArrayList<>(); 5 path.add(0); 6 dfs(res, path, graph, 0); 7 return res; 8 } 9 10 private void dfs(List<List<Integer>> res, List<Integer> path, int[][] graph, int start) { 11 if (start == graph.length - 1) { 12 res.add(new ArrayList<>(path)); 13 return; 14 } 15 for (int next : graph[start]) { 16 path.add(next); 17 dfs(res, path, graph, next); 18 path.remove(path.size() - 1); 19 } 20 } 21 }