Skip to content

Commit 64c5bbb

Browse files
solves #1136: Parallel courses in java
1 parent 6c10ca9 commit 64c5bbb

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,7 @@
517517
| 1128 | [Number of Equivalent Domino Pairs](https://leetcode.com/problems/number-of-equivalent-domino-pairs) | [![Java](assets/java.png)](src/NumberOfEquivalentDominoPairs.java) | |
518518
| 1133 | 🔒 [Largest Unique Number](https://leetcode.com/problems/largest-unique-number) | | |
519519
| 1134 | 🔒 [Armstrong Number](https://leetcode.com/problems/armstrong-number) | | |
520+
| 1136 | 🔒 [Parallel Courses](https://leetcode.com/problems/parallel-courses) | [![Java](assets/java.png)](src/ParallelCourses.java) | |
520521
| 1137 | [Nth Tribonacci Number](https://leetcode.com/problems/n-th-tribonacci-number) | [![Java](assets/java.png)](src/NthTribonacciNumber.java) | |
521522
| 1143 | [Longest Common Subsequence](https://leetcode.com/problems/longest-common-subsequence) | [![Java](assets/java.png)](src/LongestCommonSubsequence.java) | |
522523
| 1150 | [Check if Number is Majority Element in Sorted Array](https://leetcode.com/problems/check-if-a-number-is-majority-element-in-a-sorted-array) | | |

src/ParallelCourses.java

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// https://leetcode.com/problems/parallel-courses
2+
// T: O(N + E)
3+
// S: O(N + E)
4+
5+
import java.util.HashMap;
6+
import java.util.HashSet;
7+
import java.util.Map;
8+
import java.util.Set;
9+
10+
public class ParallelCourses {
11+
public int minimumSemesters(int n, int[][] relations) {
12+
final Map<Integer, Set<Integer>> graph = createGraph(relations);
13+
final int[] inDegree = computeInDegree(relations, n);
14+
return minimumSemesters(graph, inDegree);
15+
}
16+
17+
// Kahn's algorithm T: O(N + E), S: O(N)
18+
private static int minimumSemesters(Map<Integer, Set<Integer>> graph, int[] inDegree) {
19+
Set<Integer> noPrerequisites = coursesWithoutPrerequisites(inDegree);
20+
int minSemesters = 0;
21+
22+
while (!noPrerequisites.isEmpty()) {
23+
final Set<Integer> newCourses = new HashSet<>();
24+
for (int course : noPrerequisites) {
25+
inDegree[course]--;
26+
for (int neighbour : graph.getOrDefault(course, new HashSet<>())) {
27+
inDegree[neighbour]--;
28+
if (inDegree[neighbour] == 0) {
29+
newCourses.add(neighbour);
30+
}
31+
}
32+
graph.remove(course);
33+
}
34+
noPrerequisites = newCourses;
35+
minSemesters++;
36+
}
37+
38+
return graph.isEmpty() ? minSemesters : -1;
39+
}
40+
41+
// T: O(E), S: O(N)
42+
private static int[] computeInDegree(int[][] edges, int n) {
43+
final int[] inDegree = new int[n];
44+
for (int[] edge : edges) {
45+
final int to = edge[1] - 1;
46+
inDegree[to]++;
47+
}
48+
return inDegree;
49+
}
50+
51+
// T: O(N), S: O(N)
52+
private static Set<Integer> coursesWithoutPrerequisites(int[] inDegree) {
53+
final Set<Integer> set = new HashSet<>();
54+
for (int i = 0 ; i < inDegree.length ; i++) {
55+
if (inDegree[i] == 0) {
56+
set.add(i);
57+
}
58+
}
59+
return set;
60+
}
61+
62+
// T: O(E), S: O(E)
63+
private static Map<Integer, Set<Integer>> createGraph(int[][] edges) {
64+
final Map<Integer, Set<Integer>> graph = new HashMap<>();
65+
for (int[] edge : edges) {
66+
final int from = edge[0] - 1, to = edge[1] - 1;
67+
final Set<Integer> fromNeighbours = graph.getOrDefault(from, new HashSet<>());
68+
fromNeighbours.add(to);
69+
graph.putIfAbsent(from, fromNeighbours);
70+
}
71+
return graph;
72+
}
73+
}

0 commit comments

Comments
 (0)