1
- import java .util .*;
1
+ import java .util .ArrayList ;
2
+ import java .util .HashMap ;
3
+ import java .util .HashSet ;
4
+ import java .util .List ;
5
+ import java .util .Map ;
6
+ import java .util .PriorityQueue ;
7
+ import java .util .Queue ;
8
+ import java .util .Set ;
2
9
3
10
public class HelloWorld {
4
- private record Edge (int vertex , int time ) {}
5
-
6
- public int networkDelayTime (int [][] times , int n , int k ) {
7
- final Map <Integer , Map <Integer , Integer >> graph = createGraph (times );
8
- final Map <Integer , Integer > delayTimes = dijkstra (graph , k );
9
- if (delayTimes .size () != n ) {
10
- return -1 ;
11
- }
12
- return delayTimes .values ().stream ().max (Integer ::compare ).get ();
13
- }
14
-
15
- // T: O(E), S: O(E)
16
- private static Map <Integer , Map <Integer , Integer >> createGraph (int [][] edges ) {
17
- final Map <Integer , Map <Integer , Integer >> graph = new HashMap <>();
18
- for (int [] edge : edges ) {
19
- final int from = edge [0 ], to = edge [1 ], weight = edge [2 ];
20
- final Map <Integer , Integer > neighbours = graph .getOrDefault (from , new HashMap <>());
21
- neighbours .put (to , weight );
22
- graph .putIfAbsent (from , neighbours );
23
- }
24
- return graph ;
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 );
25
16
}
26
17
27
- // T: O(V + E logV )
28
- private static Map < Integer , Integer > dijkstra (Map <Integer , Map <Integer , Integer >> graph , int start ) {
29
- final Map <Integer , Integer > distances = new HashMap <>();
30
- final Queue < Edge > queue = new PriorityQueue <>(Comparator . comparingInt ( a -> a . time ) );
31
- queue . add ( new Edge ( start , 0 ) );
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 );
32
23
33
24
while (!queue .isEmpty ()) {
34
- final Edge edge = queue .poll ();
35
- if (edge .time >= distances .getOrDefault (edge .vertex , Integer .MAX_VALUE )) {
36
- continue ;
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
+ }
37
32
}
33
+ graph .remove (vertex );
34
+ }
35
+
36
+ if (order .size () != inDegree .length ) {
37
+ return new int [] {};
38
+ }
39
+ return toArray (order );
40
+ }
38
41
39
- distances .put (edge .vertex , edge .time );
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
+ }
40
49
41
- for (Map .Entry <Integer , Integer > entry : graph .getOrDefault (edge .vertex , new HashMap <>()).entrySet ()) {
42
- final int neighbour = entry .getKey (), time = entry .getValue ();
43
- queue .add (new Edge (neighbour , edge .time + time ));
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 );
44
55
}
45
56
}
46
-
47
- return distances ;
48
57
}
49
58
50
- public static void main (String [] args ) {
51
- int [] b = new int [] {1 , 2 , 3 };
52
- int [] a = b ;
53
- System .out .println (Arrays .toString (a ));
54
- b = new int [] {5 , 6 , 7 };
55
- System .out .println (Arrays .toString (a ));
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
+ }
56
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 ;
57
79
}
58
80
}
0 commit comments