course-schedule-ii.sh — zsh

Course Schedule II

medium
graphtopological-sortbreadth-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

  1. numCourses = 2, prerequisites = [[1, 0]] returns [0, 1].
  2. numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[1,2]] returns [0, 2, 1, 3].
  3. numCourses = 2, prerequisites = [[1, 0], [0, 1]] returns [] because the cycle makes every order invalid.

Constraints

  • 1 <= numCourses <= 2000
  • 0 <= prerequisites.length <= 5000
  • 0 <= a, b < numCourses and a != b for 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 and O(V + E) space.

Hints

  1. Count how many prerequisites each course still needs.
  2. 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.