LeetCode Solutions
210. Course Schedule II
Time: $O(|V| + |E|)$, where $|V| = \texttt{numCourses}$ and $|E| = |\texttt{prerequisites}|$ Space: $O(|V| + |E|)$, where $|V| = \texttt{numCourses}$ and $|E| = |\texttt{prerequisites}|$
enum class State { kInit, kVisiting, kVisited };
class Solution {
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
vector<int> ans;
vector<vector<int>> graph(numCourses);
vector<State> state(numCourses);
for (const auto& p : prerequisites)
graph[p[1]].push_back(p[0]);
for (int i = 0; i < numCourses; ++i)
if (hasCycle(graph, i, state, ans))
return {};
reverse(begin(ans), end(ans));
return ans;
}
private:
bool hasCycle(const vector<vector<int>>& graph, int u, vector<State>& state,
vector<int>& ans) {
if (state[u] == State::kVisiting)
return true;
if (state[u] == State::kVisited)
return false;
state[u] = State::kVisiting;
for (const int v : graph[u])
if (hasCycle(graph, v, state, ans))
return true;
state[u] = State::kVisited;
ans.push_back(u);
return false;
}
};
enum State { kInit, kVisiting, kVisited }
class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
Deque<Integer> ans = new ArrayDeque<>();
List<Integer>[] graph = new List[numCourses];
State[] state = new State[numCourses];
for (int i = 0; i < numCourses; ++i)
graph[i] = new ArrayList<>();
for (int[] p : prerequisites)
graph[p[1]].add(p[0]);
for (int i = 0; i < numCourses; ++i)
if (hasCycle(graph, i, state, ans))
return new int[] {};
return ans.stream().mapToInt(Integer::intValue).toArray();
}
private boolean hasCycle(List<Integer>[] graph, int u, State[] state, Deque<Integer> ans) {
if (state[u] == State.kVisiting)
return true;
if (state[u] == State.kVisited)
return false;
state[u] = State.kVisiting;
for (final int v : graph[u])
if (hasCycle(graph, v, state, ans))
return true;
state[u] = State.kVisited;
ans.addFirst(u);
return false;
}
}
from enum import Enum
class State(Enum):
kInit = 0
kVisiting = 1
kVisited = 2
class Solution:
def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:
ans = []
graph = [[] for _ in range(numCourses)]
state = [State.kInit] * numCourses
for v, u in prerequisites:
graph[u].append(v)
def hasCycle(u: int) -> bool:
if state[u] == State.kVisiting:
return True
if state[u] == State.kVisited:
return False
state[u] = State.kVisiting
if any(hasCycle(v) for v in graph[u]):
return True
state[u] = State.kVisited
ans.append(u)
return False
if any(hasCycle(i) for i in range(numCourses)):
return []
return ans[::-1]