zoukankan      html  css  js  c++  java
  • [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.

    所有可能的路径。

    这个题是一道比较典型的把回溯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(graph, 0, res, path);
     7         return res;
     8     }
     9     
    10     private void dfs(int[][] graph, int index, List<List<Integer>> res, List<Integer> path) {
    11         // base case
    12         if (index == graph.length - 1) {
    13             res.add(new ArrayList<>(path));
    14             return;
    15         }
    16         for (int next : graph[index]) {
    17             path.add(next);
    18             dfs(graph, next, res, path);
    19             path.remove(path.size() - 1);
    20         }
    21     }
    22 }

    LeetCode 题目总结

  • 相关阅读:
    P1659 [国家集训队]拉拉队排练
    manacher小结
    P4555 [国家集训队]最长双回文串
    P3649 [APIO2014]回文串
    P3899 [湖南集训]谈笑风生
    插头dp练习
    luoguP3066 [USACO12DEC]逃跑的BarnRunning
    luoguP3769 [CH弱省胡策R2]TATT
    android 广播,manifest.xml注册,代码编写
    *.db-journal 是什么(android sqlite )数据库删除缓存
  • 原文地址:https://www.cnblogs.com/cnoodle/p/13375308.html
Copyright © 2011-2022 走看看