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

Browse files
solves course schedule in java
1 parent eec695b commit 761ec3d

File tree

1 file changed

+33
-29
lines changed

1 file changed

+33
-29
lines changed

β€Žsrc/CourseSchedule.java

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,52 +4,56 @@
44

55
import java.util.ArrayList;
66
import java.util.HashMap;
7-
import java.util.HashSet;
7+
import java.util.LinkedList;
88
import java.util.List;
99
import java.util.Map;
10-
import java.util.Set;
10+
import java.util.Queue;
1111

1212
public class CourseSchedule {
1313
public boolean canFinish(int numCourses, int[][] prerequisites) {
14-
final Map<Integer, List<Integer>> dependencyGraph = getDependencyGraph(prerequisites);
15-
return !containsLoop(dependencyGraph, numCourses);
16-
}
14+
final int[] inDegree = getInDegreeValues(prerequisites, numCourses);
15+
finalQueue<Integer> queue = queueWithInDegree0Vertices(inDegree);
16+
finalMap<Integer, List<Integer>> graph = getDependencyGraph(prerequisites);
1717

18-
private boolean containsLoop(Map<Integer, List<Integer>> graph, int numCourses) {
19-
Set<Integer> computed = new HashSet<>();
20-
for (int i = 0 ; i < numCourses ; i++) {
21-
if (graph.containsKey(i)) {
22-
if (computed.contains(i)) continue;
23-
if (containsLoop(graph, i, computed)) {
24-
return true;
18+
while (!queue.isEmpty()) {
19+
int vertex = queue.poll();
20+
if (graph.containsKey(vertex)) {
21+
for (int adjacent : graph.get(vertex)) {
22+
inDegree[adjacent]--;
23+
if (inDegree[adjacent] == 0) queue.add(adjacent);
2524
}
2625
}
2726
}
28-
return false;
27+
28+
return allAreZero(inDegree);
2929
}
3030

31-
private boolean containsLoop(Map<Integer, List<Integer>> graph, int vertex, Set<Integer> computed) {
32-
return containsLoop(graph, vertex, computed, new HashSet<>());
31+
private boolean allAreZero(int[] array) {
32+
for (int element : array) {
33+
if (element != 0) return false;
34+
}
35+
return true;
3336
}
3437

35-
private boolean containsLoop(Map<Integer, List<Integer>> graph, int vertex, Set<Integer> computed, Set<Integer> visited) {
36-
if (visited.contains(vertex)) return true;
37-
if (computed.contains(vertex)) return false;
38-
visited.add(vertex);
39-
computed.add(vertex);
40-
if (graph.containsKey(vertex)) {
41-
List<Integer> dependsOn = graph.get(vertex);
42-
for (int dependency : dependsOn) {
43-
if (containsLoop(graph, dependency, computed, visited)) {
44-
return true;
45-
}
38+
private Queue<Integer> queueWithInDegree0Vertices(int[] inDegrees) {
39+
final Queue<Integer> queue = new LinkedList<>();
40+
for (int i = 0; i < inDegrees.length; i++) {
41+
if (inDegrees[i] == 0) {
42+
queue.add(i);
4643
}
4744
}
48-
visited.remove(vertex);
49-
return false;
45+
return queue;
46+
}
47+
48+
private static int[] getInDegreeValues(int[][] preRequisites, int numCourses) {
49+
int[] result = new int[numCourses];
50+
for (int[] preRequisite: preRequisites) {
51+
result[preRequisite[1]]++;
52+
}
53+
return result;
5054
}
5155

52-
private Map<Integer, List<Integer>> getDependencyGraph(int[][] prerequisites) {
56+
private staticMap<Integer, List<Integer>> getDependencyGraph(int[][] prerequisites) {
5357
final Map<Integer, List<Integer>> dependencyGraph = new HashMap<>();
5458
for (int[] prerequisite : prerequisites) {
5559
if (!dependencyGraph.containsKey(prerequisite[0])) {

0 commit comments

Comments
(0)

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