Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 47515b9

Browse files
Add solution for Course Schedule II
1 parent daa0c91 commit 47515b9

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed

‎README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ Algorithm exercises from LeetCode implemented in Java v11.
147147

148148
### Topological Sort
149149
- Course Schedule | [Problem](https://leetcode.com/problems/course-schedule) | [Solution](src/solutions/CourseSchedule.java)
150+
- Course Schedule II | [Problem](https://https://leetcode.com/problems/course-schedule-ii) | [Solution](src/solutions/CourseScheduleII.java)
150151
- Find All Possible Recipes from Given Supplies | [Problem](https://leetcode.com/problems/find-all-possible-recipes-from-given-supplies) | [Solution](src/solutions/FindAllPossibleRecipes.java)
151152

152153
### Bit Manipulation

‎src/solutions/CourseScheduleII.java

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package solutions;
2+
3+
import java.util.*;
4+
5+
// [Problem] https://leetcode.com/problems/course-schedule-ii
6+
class CourseScheduleII {
7+
// Topological sort
8+
// O(v + e) time, O(v + e) space
9+
// where v = number of courses, e = number of prerequisites
10+
public int[] findOrder(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[] order = new int[numCourses];
27+
int orderIndex = 0;
28+
while (!coursesToTake.isEmpty() && orderIndex < numCourses) {
29+
int currentCourse = coursesToTake.poll();
30+
order[orderIndex++] = currentCourse;
31+
List<Integer> nextCourses = nextCourseMap.get(currentCourse);
32+
if (nextCourses != null) {
33+
for (int nextCourse : nextCourses) {
34+
if (--numPrerequisites[nextCourse] == 0) {
35+
coursesToTake.add(nextCourse);
36+
}
37+
}
38+
}
39+
}
40+
return orderIndex == numCourses ? order : new int[0];
41+
}
42+
43+
// Test
44+
public static void main(String[] args) {
45+
CourseScheduleII solution = new CourseScheduleII();
46+
47+
int numCourses1 = 2;
48+
int[][] prerequisites1 = {{1, 0}};
49+
int[] expectedOutput1 = {0, 1};
50+
int[] actualOutput1 = solution.findOrder(numCourses1, prerequisites1);
51+
System.out.println("Test 1 passed? " + Arrays.equals(expectedOutput1, actualOutput1));
52+
53+
int numCourses2 = 4;
54+
int[][] prerequisites2 = {{1, 0}, {2, 0}, {3, 1}, {3, 2}};
55+
int[] expectedOutput2 = {0, 1, 2, 3};
56+
int[] actualOutput2 = solution.findOrder(numCourses2, prerequisites2);
57+
System.out.println("Test 2 passed? " + Arrays.equals(expectedOutput2, actualOutput2));
58+
}
59+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /