Skip to content

Course Schedule II

You are given a number of courses labeled from 0 to numCourses - 1 and a list of prerequisite pairs prerequisites where prerequisites[i] = [ai, bi] means you must take course bi before taking course ai. Return the ordering of courses you should take to finish all courses. Return an empty array if impossible.

numCoursesprerequisitesOutputExplanation
2[[1,0]][0,1]Take course 0, then course 1
4[[1,0],[2,0],[3,1],[3,2]][0,2,1,3] or [0,1,2,3]Valid topological order (multiple valid orderings exist)
3[[1,0],[0,1]][]Circular dependency — impossible
1[][0]No prerequisites, single course
  • 1 <= numCourses <= 2000
  • 0 <= prerequisites.length <= 5000
  • prerequisites[i].length == 2
  • 0 <= ai, bi < numCourses
  • ai != bi (no self-loops)
  • All (ai, bi) are unique
ApproachTimeSpaceNotes
DFS TopologicalO(n)O(n)First approach
BFS KahnO(n)O(n)Second approach
★ Recommended
⏱ Time O(n) 💾 Space O(n)
course_schedule_ii_dfs_topological.py
def findOrder(numCourses, prerequisites):
"""DFS topological sort to get course order."""
graph = [[] for _ in range(numCourses)]
for course, prereq in prerequisites:
graph[course].append(prereq)
state = [0] * numCourses
order = []
def dfs(course):
if state[course] == 1:
return False
if state[course] == 2:
return True
state[course] = 1
for prereq in graph[course]:
if not dfs(prereq):
return False
state[course] = 2
order.append(course)
return True
for i in range(numCourses):
if not dfs(i):
return []
return order
✓ Simple
⏱ Time O(n) 💾 Space O(n)
course_schedule_ii_bfs_kahn.py
"""
Solution for Course Schedule II
"""
def solve():
"""Implementation for approach 3 of Course Schedule II"""
pass
if __name__ == "__main__":
print("Solution ready")