graph
topological-sort
breadth-first-search
There are numCourses courses labeled from 0 to numCourses - 1. Each prerequisite pair [a, b] means you must take course b before course a.
Return one valid ordering of every course. If the prerequisite graph contains a cycle, return [].
Input / output
- Input:
numCourses: int,prerequisites: int[][] - Output:
int[]containing a valid order, or[]if impossible
Examples
numCourses = 2,prerequisites = [[1, 0]]returns[0, 1].numCourses = 4,prerequisites = [[1,0],[2,0],[3,1],[1,2]]returns[0, 2, 1, 3].numCourses = 2,prerequisites = [[1, 0], [0, 1]]returns[]because the cycle makes every order invalid.
Constraints
1 <= numCourses <= 20000 <= prerequisites.length <= 50000 <= a, b < numCoursesanda != bfor every pair[a, b].
Edge cases
- Some courses may have no prerequisites at all.
- The graph may contain multiple disconnected components.
- A cycle anywhere in the graph invalidates the entire schedule.
Target complexity
- Aim for
O(V + E)time andO(V + E)space.
Hints
- Count how many prerequisites each course still needs.
- Repeatedly remove any course whose indegree is zero and update its outgoing neighbors.
Follow-up How would you detect the cycle with DFS color states instead of Kahn's breadth-first topological sort?
Examples
Example 1
Input: numCourses = 2, prerequisites = [[1,0]]
Output: [0,1]
Example 2
Input: numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[1,2]]
Output: [0,2,1,3]
Example 3
Input: numCourses = 2, prerequisites = [[1,0],[0,1]]
Output: []
🔒 5 hidden
Running will execute all 8 cases, including 5 hidden ones.