1
+ package solutions ;
2
+
3
+ import java .util .*;
4
+
5
+ // [Problem] https://leetcode.com/problems/course-schedule
6
+ class CourseSchedule {
7
+ // Topological sort
8
+ // O(v + e) time, O(v + e) space
9
+ // where v = number of courses, e = number of prerequisites
10
+ public boolean canFinish (int numCourses , int [][] prerequisites ) {
11
+ Map <Integer , List <Integer >> nextCourseMap = new HashMap <>();
12
+ int [] numPrerequisites = new int [numCourses ];
13
+ for (int [] courseToPrerequisite : prerequisites ) {
14
+ int course = courseToPrerequisite [0 ];
15
+ int prerequisite = courseToPrerequisite [1 ];
16
+ nextCourseMap .putIfAbsent (prerequisite , new ArrayList <>());
17
+ nextCourseMap .get (prerequisite ).add (course );
18
+ numPrerequisites [course ]++;
19
+ }
20
+ Queue <Integer > coursesToTake = new LinkedList <>();
21
+ for (int i = 0 ; i < numCourses ; i ++) {
22
+ if (numPrerequisites [i ] == 0 ) {
23
+ coursesToTake .add (i );
24
+ }
25
+ }
26
+ int count = 0 ;
27
+ while (!coursesToTake .isEmpty ()) {
28
+ int currentCourse = coursesToTake .poll ();
29
+ List <Integer > nextCourses = nextCourseMap .get (currentCourse );
30
+ if (nextCourses != null ) {
31
+ for (int nextCourse : nextCourses ) {
32
+ if (--numPrerequisites [nextCourse ] == 0 ) {
33
+ coursesToTake .add (nextCourse );
34
+ }
35
+ }
36
+ }
37
+ count ++;
38
+ }
39
+ return count == numCourses ;
40
+ }
41
+
42
+ // Test
43
+ public static void main (String [] args ) {
44
+ CourseSchedule solution = new CourseSchedule ();
45
+
46
+ int numCourses1 = 2 ;
47
+ int [][] prerequisites1 = {{1 , 0 }};
48
+ boolean expectedOutput1 = true ;
49
+ boolean actualOutput1 = solution .canFinish (numCourses1 , prerequisites1 );
50
+ System .out .println ("Test 1 passed? " + (expectedOutput1 == actualOutput1 ));
51
+
52
+ int numCourses2 = 3 ;
53
+ int [][] prerequisites2 = {{1 , 0 }, {0 , 1 }};
54
+ boolean expectedOutput2 = false ;
55
+ boolean actualOutput2 = solution .canFinish (numCourses2 , prerequisites2 );
56
+ System .out .println ("Test 2 passed? " + (expectedOutput2 == actualOutput2 ));
57
+ }
58
+ }
0 commit comments