There are numCourses courses and prerequisites[i] = [a, b] means b must be taken before a. Return an order in which all courses can be taken, or [] if that is impossible.
A course finishes in DFS only after everything that depends on it has finished. Reversing the finish order gives a valid schedule; reaching a node still on the path means a cycle.
1function findOrder(numCourses: number, prerequisites: number[][]): number[] {2const adj: number[][] = Array.from({ length: numCourses }, () => []);3for (const [a, b] of prerequisites) adj[b].push(a);4const state = new Array(numCourses).fill(0), post: number[] = [];5const dfs = (u: number): boolean => {6if (state[u] === 1) return false;7if (state[u] === 2) return true;8state[u] = 1;9for (const v of adj[u]) if (!dfs(v)) return false;10state[u] = 2; post.push(u);11return true;12};13for (let i = 0; i < numCourses; i++) if (!dfs(i)) return [];14return post.reverse();15}
Build the adjacency list.
Space: play/pause · ←/→: step