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 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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 73 additions & 0 deletions
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)

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /