8
8
import java .util .Set ;
9
9
10
10
public class HelloWorld {
11
- // T: O(V + E) S: O(V + E)
12
- public int [] findOrder (int numCourses , int [][] prerequisites ) {
13
- final Map <Integer , Set <Integer >> graph = createGraph (prerequisites );
14
- final int [] inDegree = computeInDegree (numCourses , prerequisites );
15
- return orderOfCourses (graph , inDegree );
11
+ public List <List <Integer >> combinationSum (int [] candidates , int target ) {
12
+ final Set <List <Integer >> result = new HashSet <>();
13
+ computeSums (candidates , target , result , 0 , new ArrayList <>(), 0 );
14
+ return new ArrayList <>(result );
16
15
}
17
16
18
- // T: O(V + E) S: O(V)
19
- private static int [] orderOfCourses (Map <Integer , Set <Integer >> graph , int [] inDegree ) {
20
- final Queue <Integer > queue = new PriorityQueue <>();
21
- final List <Integer > order = new ArrayList <>();
22
- addAll0InDegreeToQueue (queue , inDegree );
23
-
24
- while (!queue .isEmpty ()) {
25
- final int vertex = queue .poll ();
26
- order .add (vertex );
27
- for (int neighbour : graph .getOrDefault (vertex , new HashSet <>())) {
28
- inDegree [neighbour ]--;
29
- if (inDegree [neighbour ] == 0 ) {
30
- queue .add (neighbour );
31
- }
32
- }
33
- graph .remove (vertex );
17
+ private static void computeSums (int [] candidates , int target , Set <List <Integer >> result , int currentSum , List <Integer > current , int i ) {
18
+ if (currentSum > target || i >= candidates .length ) {
19
+ return ;
34
20
}
35
-
36
- if ( order . size () != inDegree . length ) {
37
- return new int [] {} ;
21
+ if ( currentSum == target ) {
22
+ result . add ( new ArrayList <>( current ));
23
+ return ;
38
24
}
39
- return toArray (order );
40
- }
41
25
42
- private static int [] toArray (List <Integer > list ) {
43
- final int [] array = new int [list .size ()];
44
- for (int i = 0 ; i < array .length ; i ++) {
45
- array [i ] = list .get (i );
46
- }
47
- return array ;
48
- }
49
-
50
- // T: O(E) S: O(1)
51
- private static void addAll0InDegreeToQueue (Queue <Integer > queue , int [] inDegree ) {
52
- for (int i = 0 ; i < inDegree .length ; i ++) {
53
- if (inDegree [i ] == 0 ) {
54
- queue .add (i );
55
- }
56
- }
57
- }
58
-
59
- // T: O(E) S: O(E)
60
- private static int [] computeInDegree (int n , int [][] edges ) {
61
- final int [] inDegree = new int [n ];
62
- for (int [] edge : edges ) {
63
- final int to = edge [0 ];
64
- inDegree [to ]++;
65
- }
66
- return inDegree ;
67
- }
68
-
69
- // T: O(|E|), S: O(E)
70
- private static Map <Integer , Set <Integer >> createGraph (int [][] edges ) {
71
- final Map <Integer , Set <Integer >> graph = new HashMap <>();
72
- for (int [] edge : edges ) {
73
- final int to = edge [0 ], from = edge [1 ];
74
- final Set <Integer > set = graph .getOrDefault (from , new HashSet <>());
75
- set .add (to );
76
- graph .putIfAbsent (from , set );
77
- }
78
- return graph ;
26
+ computeSums (candidates , target , result , currentSum , current , i + 1 );
27
+ current .add (candidates [i ]);
28
+ computeSums (candidates , target , result , currentSum + candidates [i ], current , i );
29
+ computeSums (candidates , target , result , currentSum + candidates [i ], current , i + 1 );
30
+ current .removeLast ();
79
31
}
80
32
}
0 commit comments