function findOrder(numCourses, prerequisites):
adj = empty adjacency list of size numCourses
inDegree = array of size numCourses, all zeros
for each [a, b] in prerequisites:
adj[b].append(a)
inDegree[a] += 1
queue = empty queue
for i from 0 to numCourses - 1:
if inDegree[i] == 0:
queue.push(i)
result = []
while queue is not empty:
u = queue.pop()
result.append(u)
for each v in adj[u]:
inDegree[v] -= 1
if inDegree[v] == 0:
queue.push(v)
if result.length == numCourses:
return result
else:
return [] // cycle detected
Time: . Each node and edge is processed once.
Space: . For the adjacency list, in-degree array, and queue.