-
Notifications
You must be signed in to change notification settings - Fork 117
Expand file tree
/
Copy pathAllPathsFromSourceToTarget797.java
More file actions
72 lines (64 loc) · 2.24 KB
/
AllPathsFromSourceToTarget797.java
File metadata and controls
72 lines (64 loc) · 2.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/**
* 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 are0, 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.
*/
public class AllPathsFromSourceToTarget797 {
public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
List<List<Integer>> res = new ArrayList<>();
if (graph == null || graph.length == 0) return res;
int N = graph.length;
backtrace(graph, 0, N-1, new ArrayList<>(), res, N);
return res;
}
private void backtrace(int[][] graph, int current, int dest, List<Integer> path, List<List<Integer>> res, int N) {
if (current == dest) {
path.add(current);
res.add(new ArrayList<>(path));
path.remove(path.size() - 1);
return;
}
path.add(current);
for (int child: graph[current]) {
backtrace(graph, child, N-1, path, res, N);
}
path.remove(path.size() - 1);
}
public List<List<Integer>> allPathsSourceTarget2(int[][] graph) {
List<List<Integer>> res = new ArrayList<>();
if (graph == null || graph.length == 0) return res;
int N = graph.length;
List<Integer> path = new ArrayList<>();
path.add(0);
backtrace2(graph, 0, N-1, path, res, N);
return res;
}
private void backtrace2(int[][] graph, int current, int dest, List<Integer> path, List<List<Integer>> res, int N) {
if (current == dest) {
res.add(new ArrayList<>(path));
return;
}
for (int child: graph[current]) {
path.add(child);
backtrace2(graph, child, N-1, path, res, N);
path.remove(path.size() - 1);
}
}
}