Skip to content

Course Schedule

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 true if you can finish all courses, otherwise return false.

numCoursesprerequisitesOutputExplanation
2[[1,0]]trueTake course 0 first, then course 1
2[[1,0],[0,1]]falseCircular dependency: course 0 requires 1, course 1 requires 0
3[[0,1],[0,2],[1,2]]trueTake course 2, then 1, then 0
4[[1,0],[2,0],[3,1],[3,2]]trueValid topological order: 0 → 1 → 2 → 3 and 0 → 2 → 3
  • 1 <= numCourses <= 2000
  • 0 <= prerequisites.length <= 5000
  • prerequisites[i].length == 2
  • 0 <= ai, bi < numCourses
  • All values 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_dfs_topological.py
def canFinish(numCourses, prerequisites):
"""DFS topological sort to detect cycle."""
graph = [[] for _ in range(numCourses)]
for course, prereq in prerequisites:
graph[course].append(prereq)
state = [0] * numCourses # 0: unvisited, 1: visiting, 2: visited
def has_cycle(course):
if state[course] == 1:
return True # Cycle detected
if state[course] == 2:
return False # Already processed
state[course] = 1
for prereq in graph[course]:
if has_cycle(prereq):
return True
state[course] = 2
return False
for i in range(numCourses):
if has_cycle(i):
return False
return True
✓ Simple
⏱ Time O(n) 💾 Space O(n)
course_schedule_bfs_kahn.py
"""
Solution for Course Schedule
"""
def solve():
"""Implementation for approach 3 of Course Schedule"""
pass
if __name__ == "__main__":
print("Solution ready")