Course Schedule II — Topological Order

Sanjeev SharmaSanjeev Sharma
1 min read

Advertisement

Problem

Return any valid order to finish all courses, or empty array if impossible.


Solutions

Python

from collections import deque
class Solution:
    def findOrder(self, n: int, prereqs: list[list[int]]) -> list[int]:
        adj=[[] for _ in range(n)]; indeg=[0]*n
        for a,b in prereqs: adj[b].append(a); indeg[a]+=1
        q=deque(i for i in range(n) if indeg[i]==0)
        order=[]
        while q:
            node=q.popleft(); order.append(node)
            for nb in adj[node]:
                indeg[nb]-=1
                if indeg[nb]==0: q.append(nb)
        return order if len(order)==n else []

C++

class Solution {
public:
    vector<int> findOrder(int n, vector<vector<int>>& pre){
        vector<vector<int>> adj(n); vector<int> indeg(n,0);
        for(auto& p:pre){adj[p[1]].push_back(p[0]);indeg[p[0]]++;}
        queue<int> q; for(int i=0;i<n;i++) if(!indeg[i]) q.push(i);
        vector<int> order;
        while(!q.empty()){
            int u=q.front();q.pop();order.push_back(u);
            for(int v:adj[u]) if(!--indeg[v]) q.push(v);
        }
        return order.size()==n?order:vector<int>{};
    }
};

Complexity

  • Time: O(V+E) | Space: O(V+E)

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro