Course Schedule II — Topological Order via BFS

Sanjeev SharmaSanjeev Sharma
1 min read

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

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro