Learning Outcome
After this lesson, you should be able to model prerequisites as a directed graph and use zero-indegree BFS to detect cycles.
Problem Statement
Given numCourses and prerequisite pairs, return true if all courses can be finished.
| Input | Output | Why |
|---|---|---|
numCourses = 2, prerequisites = [[1,0]] | true | Course 0 can be taken first, then course 1 becomes available. |
Brute Force Approach
Try every possible course order. This is factorial in the number of courses and quickly becomes impossible.
Optimized Approach
Build a directed graph from prerequisite to course. Repeatedly take courses with indegree 0 and count how many courses are removed.
Exact Pseudocode
build graph and indegree
queue = all courses with indegree 0
taken = 0
while queue not empty:
course = pop front
taken += 1
for nextCourse in graph[course]:
indegree[nextCourse] -= 1
if indegree[nextCourse] becomes 0:
push nextCourse
return taken equals numCourses
Reference Code
from collections import deque
class Solution:
def canFinish(self, numCourses, prerequisites):
graph = [[] for _ in range(numCourses)]
indegree = [0] * numCourses
for course, pre in prerequisites:
graph[pre].append(course)
indegree[course] += 1
q = deque(i for i in range(numCourses) if indegree[i] == 0)
taken = 0
while q:
course = q.popleft()
taken += 1
for nxt in graph[course]:
indegree[nxt] -= 1
if indegree[nxt] == 0:
q.append(nxt)
return taken == numCoursesSample Dry Run
| Step | State | Result |
|---|---|---|
| Build graph | 0 points to 1 | indegree[1] = 1 |
| Initial queue | Course 0 has indegree 0 | queue = [0] |
| Take 0 | Reduce indegree of 1 to 0 | queue = [1] |
| Take 1 | taken = 2 | return true |
Complexity
| Measure | Value | Reason |
|---|---|---|
| Time | O(v + e) | Each course and prerequisite edge is processed once. |
| Space | O(v + e) | The graph, indegree array, and queue take linear space. |
Edge Cases
- No prerequisites should return true.
- A cycle leaves some courses with positive indegree.
- Edge direction must be prerequisite to course.
Interview Checklist
- Build indegree from course dependencies.
- Start with all zero-indegree courses.
- Compare taken count with numCourses.
FAQs
Why does a cycle fail?
Every course in the cycle waits for another course in the same cycle, so none reaches indegree 0.
Can DFS solve Course Schedule?
Yes. DFS cycle detection with visiting states is another standard solution.
What is the core pattern?
Topological sort using Kahn BFS.