Course Schedule II — Topological Order via BFS
Advertisement
Problem 289 · Course Schedule II
Difficulty: Medium · Pattern: Topological Order
Return topological order, or [] if impossible.
Solutions
# Python
from collections import defaultdict, deque
def findOrder(numCourses, prerequisites):
in_deg = [0]*numCourses
graph = defaultdict(list)
for a, b in prerequisites:
graph[b].append(a); in_deg[a] += 1
queue = deque(i for i in range(numCourses) if in_deg[i]==0)
order = []
while queue:
node = queue.popleft(); order.append(node)
for nei in graph[node]:
in_deg[nei] -= 1
if in_deg[nei] == 0: queue.append(nei)
return order if len(order) == numCourses else []
// Java
public int[] findOrder(int n, int[][] prereqs) {
int[] inDeg = new int[n]; int[] order = new int[n]; int idx = 0;
List<List<Integer>> g = new ArrayList<>();
for (int i=0;i<n;i++) g.add(new ArrayList<>());
for (int[] p:prereqs) { g.get(p[1]).add(p[0]); inDeg[p[0]]++; }
Queue<Integer> q = new LinkedList<>();
for (int i=0;i<n;i++) if (inDeg[i]==0) q.offer(i);
while (!q.isEmpty()) {
int node=q.poll(); order[idx++]=node;
for (int nei:g.get(node)) if(--inDeg[nei]==0) q.offer(nei);
}
return idx==n?order:new int[0];
}
Complexity
- Time: O(V+E)
- Space: O(V+E)
Advertisement