PracticeNeetCode ↗LeetCode ↗
Same setup as Course Schedule, but return one valid order to take all numCourses courses given the prerequisite pairs. If no valid order exists, return an empty array.
visiting and visited sets as in Course Schedule.False (cycle). If visited, return True. Otherwise mark visiting, recurse into every prerequisite, then mark visited, append the course to the result list, and return True.False, return [] immediately.Time: O(V + E) — Space: O(V + E)
def findOrder(numCourses: int, prerequisites: list[list[int]]) -> list[int]:
graph = {i: [] for i in range(numCourses)}
for course, pre in prerequisites:
graph[course].append(pre)
visiting, visited = set(), set()
order = []
def dfs(course: int) -> bool:
if course in visiting:
return False
if course in visited:
return True
visiting.add(course)
for pre in graph[course]:
if not dfs(pre):
return False
visiting.remove(course)
visited.add(course)
order.append(course)
return True
for course in range(numCourses):
if not dfs(course):
return []
return orderHow the solution above works, piece by piece.
graph[course] lists prerequisites.order.[].Running it on numCourses = 4, prerequisites = [[1, 0], [2, 0], [3, 1], [3, 2]]:
order. DFS from 0 finishes 0 first (no prerequisites); DFS from 1 finds 0 done and finishes 1; then 2; then 3, whose prerequisites 1 and 2 are both done.