1. 题目描述
给定一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)。 二维数组的第 i 个数组中的单元都表示有向图中 i 号节点所能到达的下一些节点,空就是没有下一个结点了。
输入:graph = [[1,2,3],[2],[3],[]]
输出:[[0,1,2,3],[0,2,3],[0,3]]
2. 题目分析
首先我们根据题目描述画出图,并分析输入输出,输入输出都是二维数组,根据题目描述,我们采用深度优先搜索遍历图,求出所有可能的路径。具体,可以从0号位置出发, 用栈记录路径上的点, 每次当我们找到最终位置后就将其加入到返回列表中;因为操作中不会反复遍历同一个点,所以我们不用标记该点,采用回溯思想即可。
3. 代码实现
class Solution {
List<List<Integer>> ret = new LinkedList<>();
Deque<Integer> stack = new ArrayDeque<>();
public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
stack.offerLast(0);
dfs(graph, 0, graph.length-1);
return ret;
}
public void dfs(int[][] graph, int start, int end){
if(start==end){
ret.add(new ArrayList<Integer>(stack));
return;
}
for(int x : graph[start]){
stack.offerLast(x);
dfs(graph, x, end);
stack.pollLast();
}
}
}
4. 今日收获
①DFS深度优先搜索遍历代码实现 ②使用Deque类实现栈,具体参考博客:Java双向队列Deque栈与队列
|