88import java .util .Set ;
99
1010public 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 );
1615 }
1716
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 ;
3420 }
35-
36- if ( order . size () != inDegree . length ) {
37- return new int [] {} ;
21+ if ( currentSum == target ) {
22+ result . add ( new ArrayList <>( current ));
23+ return ;
3824 }
39- return toArray (order );
40- }
4125
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 ();
7931 }
8032}
0 commit comments