Skip to content

Commit af921bd

Browse files
solves course schedule ii
1 parent 0371e70 commit af921bd

File tree

2 files changed

+102
-1
lines changed

2 files changed

+102
-1
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@
170170
| 207 | [Course Schedule](https://leetcode.com/problems/course-schedule) | [![Java](assets/java.png)](src/CourseSchedule.java) | |
171171
| 208 | [Implement Trie (Prefix Tree)](https://leetcode.com/problems/implement-trie-prefix-tree) | [![Java](assets/java.png)](src/Trie.java) | |
172172
| 209 | [Minimum Size Subarray Sum](https://leetcode.com/problems/minimum-size-subarray-sum) | [![Java](assets/java.png)](src/MinimumSizeSubarraySum.java) | |
173-
| 210 | [Course Schedule II](https://leetcode.com/problems/course-schedule-ii) | | |
173+
| 210 | [Course Schedule II](https://leetcode.com/problems/course-schedule-ii) | [![Java](assets/java.png)](src/CourseScheduleII.java) | |
174174
| 211 | [Design Add and Search Words Data Structure](https://leetcode.com/problems/design-add-and-search-words-data-structure) | | |
175175
| 213 | [House Robber II](https://leetcode.com/problems/house-robber-ii) | | |
176176
| 215 | [Kth Largest Element in an Array](https://leetcode.com/problems/kth-largest-element-in-an-array) | [![Java](assets/java.png)](src/KthLargestElementInAnArray.java) | |

src/CourseScheduleII.java

+101
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
// https://leetcode.com/problems/course-schedule-ii
2+
// T: O(V + E) --> O(numCourses + |preReq|)
3+
// S: O(V + E) --> O(numCourses + |preReq|)
4+
5+
import java.util.ArrayList;
6+
import java.util.HashMap;
7+
import java.util.HashSet;
8+
import java.util.LinkedList;
9+
import java.util.List;
10+
import java.util.Map;
11+
import java.util.Queue;
12+
import java.util.Set;
13+
14+
public class CourseScheduleII {
15+
private static final class Vertex {
16+
private final int data;
17+
private final Set<Edge> edges = new HashSet<>();
18+
private int outDegree = 0;
19+
20+
Vertex(int data) {
21+
this.data = data;
22+
}
23+
24+
private void addEdge(Edge edge) {
25+
edges.add(edge);
26+
if (edge.from == this) outDegree++;
27+
}
28+
29+
private void removeEdge(Edge edge) {
30+
edges.remove(edge);
31+
if (edge.from == this) outDegree--;
32+
}
33+
34+
private boolean hasDependency() {
35+
return outDegree > 0;
36+
}
37+
}
38+
39+
private record Edge(Vertex from, Vertex to) { }
40+
41+
public int[] findOrder(int numCourses, int[][] prerequisites) {
42+
final Map<Integer, Vertex> graph = createGraphWithNVertices(numCourses);
43+
mapPrerequisitesInGraph(graph, prerequisites);
44+
List<Integer> topologicalOrder = topologicalSort(graph);
45+
return topologicalOrder.size() == numCourses ? toArray(topologicalOrder) : new int[] { };
46+
}
47+
48+
private List<Integer> topologicalSort(Map<Integer, Vertex> graph) {
49+
final Queue<Vertex> queue = zeroDependencyVertices(graph);
50+
final List<Integer> order = new ArrayList<>();
51+
52+
while (!queue.isEmpty()) {
53+
Vertex vertex = queue.poll();
54+
order.add(vertex.data);
55+
for (Edge edge : vertex.edges) {
56+
edge.from.removeEdge(edge);
57+
if (!edge.from.hasDependency()) {
58+
queue.add(edge.from);
59+
}
60+
}
61+
}
62+
63+
return order;
64+
}
65+
66+
private Queue<Vertex> zeroDependencyVertices(Map<Integer, Vertex> graph) {
67+
final Queue<Vertex> queue = new LinkedList<>();
68+
for (Vertex vertex : graph.values()) {
69+
if (!vertex.hasDependency()) {
70+
queue.add(vertex);
71+
}
72+
}
73+
return queue;
74+
}
75+
76+
private void mapPrerequisitesInGraph(Map<Integer, Vertex> graph, int[][] prerequisites) {
77+
for (int[] preRequisite : prerequisites) {
78+
Vertex from = graph.get(preRequisite[0]);
79+
Vertex to = graph.get(preRequisite[1]);
80+
Edge edge = new Edge(from, to);
81+
from.addEdge(edge);
82+
to.addEdge(edge);
83+
}
84+
}
85+
86+
private Map<Integer, Vertex> createGraphWithNVertices(int n) {
87+
final Map<Integer, Vertex> graph = new HashMap<>();
88+
for (int i = 0 ; i < n ; i++) {
89+
graph.put(i, new Vertex(i));
90+
}
91+
return graph;
92+
}
93+
94+
private int[] toArray(List<Integer> list) {
95+
final int[] array = new int[list.size()];
96+
for (int i = 0 ; i < array.length ; i++) {
97+
array[i] = list.get(i);
98+
}
99+
return array;
100+
}
101+
}

0 commit comments

Comments
 (0)