1. 程式人生 > 其它 >LeetCode——797. 所有可能的路徑(Java)

LeetCode——797. 所有可能的路徑(Java)

題目描述

題幹:
給你一個有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]]

題解思路

返回第一個到最後一個節點的所有路徑,而且這裡的模型是有向無環圖

所以無論用樹還是圖都可以,這裡採用深度優先遍歷的思路,當然廣度也可以

用佇列儲存所有可以到達的路徑,最後返回總的List集合

正確程式碼

class allPathsSourceTargetSolution {
    List<List<Integer>> ans = new ArrayList<>();
    Deque<Integer> stack = new ArrayDeque<>();

    public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
        stack.offerLast(0);
        dfs(graph, 0, graph.length - 1);
        return ans;
    }

    public void dfs(int[][] graph, int x, int n) {
        if (x == n) {
            ans.add(new ArrayList<Integer>(stack));
            return;
        }
        for (int y : graph[x]) {
            stack.offerLast(y);
            dfs(graph, y, n);
            stack.pollLast();
        }
    }
}

總結

這裡需要總結一下Queue的一些常用方法,感興趣大家可以去看我的另一篇總結常用方法的文章

https://www.cnblogs.com/bc-song/p/15117117.html

如果文章存在問題或者有更好的題解,歡迎在評論區斧正和評論,各自努力,你我最高處見