Monday, April 16, 2018

Leetcode 797. All Paths From Source to Target

Given a directed, acyclic graph of N nodes.  Find all possible paths from node 0 to node N-1, and return them in any order.
The graph is given as follows:  the nodes are 0, 1, ..., graph.length - 1.  graph[i] is a list of all nodes j for which the edge (i, j) exists.
Example:
Input: [[1,2], [3], [3], []] 
Output: [[0,1,3],[0,2,3]] 
Explanation: The graph looks like this:
0--->1
|    |
v    v
2--->3
There are two paths: 0 -> 1 -> 3 and 0 -> 2 -> 3.
Note:
  • The number of nodes in the graph will be in the range [2, 15].
  • You can print different paths in any order, but you should keep the order of nodes inside one path.

Analysis:
A DFS for all the nodes should solve the problem.

Code (Java):
class Solution {
    public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
        List<List<Integer>> ans = new ArrayList<>();
        
        if (graph == null || graph.length == 0) {
            return ans;
        }
        
        // DFS
        //
        List<Integer> path = new ArrayList<>();
        findPathToTarget(graph, 0, path, ans);
        
        return ans;
    }
    
    private void findPathToTarget(int[][] graph, int source, List<Integer> path, 
                                  List<List<Integer>> ans) {
        path.add(source);
        
        if (source == graph.length - 1) {
            List<Integer> cloneList = new ArrayList<>(path);
            ans.add(cloneList);
        }
        
        for (int neighbor : graph[source]) {
            findPathToTarget(graph, neighbor, path, ans);
        }
        
        path.remove(path.size() - 1);
    }
}


Complexity Analysis
  • Time Complexity: O(2^N N^2). We can have exponentially many paths, and for each such path, our prepending operation path.add(0, node) will be O(N^2).
  • Space Complexity: O(2^N N), the size of the output dominating the final space complexity.

No comments:

Post a Comment