面试算法110:所有路径

题目

一个有向无环图由n个节点(标号从0到n-1,n≥2)组成,请找出从节点0到节点n-1的所有路径。图用一个数组graph表示,数组的graph[i]包含所有从节点i能直接到达的节点。例如,输入数组graph为[[1,2],[3],[3],[]],则输出两条从节点0到节点3的路径,分别为0→1→3和0→2→3。
面试算法110:所有路径_第1张图片

分析

由于这个题目要求列出从节点0到节点n-1的所有路径,因此深度优先搜索是更合适的选择。
当从节点i出发能够抵达的所有节点都搜索完毕之后,将回到前一个节点搜索其他与之相邻的节点。在回到前一个节点之前,需要将节点i从路径中删除。

public class Test {
    public static void main(String[] args) {
        int[][] graph = {{1, 2}, {3}, {3}, {}};
        List<List<Integer>> result = allPathsSourceTarget(graph);
        System.out.println(result);
    }

    public static List<List<Integer>> allPathsSourceTarget(int[][] graph) {
        List<List<Integer>> result = new LinkedList<>();
        List<Integer> path = new LinkedList<>();
        dfs(0, graph, path, result);
        return result;
    }

    private static void dfs(int source, int[][] graph, List<Integer> path, List<List<Integer>> result) {
        path.add(source);
        if (source == graph.length - 1) {
            result.add(new LinkedList<>(path));
        }
        else {
            for (int next : graph[source]) {
                dfs(next, graph, path, result);
            }
        }

        path.remove(path.size() - 1);
    }

}

你可能感兴趣的:(算法,面试,算法,职场和发展)