leetcode 797. 所有可能的路径

给你一个有 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

递归遍历 + 数组记录遍历的路径

1:创建一个n长的数组arr,用来记录遍历的路径,使用遍历index来记录arr的有效长度。

2:递归遍历graph数组,用n来记录遍历到的节点。

3:若是n == length - 1, 说明是遍历到了目标节点上,就把arr转换为集合values,并添加到list中。

4:否则,继续遍历n 指向的节点。

    private List<List<Integer>> list = new ArrayList<>();
    private int[][] graph;
    private int[] arr;
    private int length;
    public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
        this.length = graph.length;
        this.graph = graph;
        this.arr = new int[length];
        find(0, 0);
        return list;
    }

    private void find(int index, int n) {
        if (n == length - 1) {
            List<Integer> values = new ArrayList<>(index + 1);
            for (int i = 0; i < index; i++) {
                values.add(arr[i]);
            }
            values.add(n);
            list.add(values);
            return;
        }
        int[] ints = graph[n];
        arr[index] = n;
        for (int anInt : ints) {
            find(index + 1, anInt);
        }
    }

posted @ 2021-08-25 13:52  旺仔古李  阅读(65)  评论(0编辑  收藏  举报