Topological Sort (Kahn's & DFS)

Trees & Graphs

Linear dependency ordering and cycle detection in Directed Acyclic Graphs (DAG)

39 problems·1 Easy·15 Medium·23 Hard
Pattern Study Guide & Cheat Sheet

Linearly order vertices in a Directed Acyclic Graph (DAG) such that for every directed edge u -> v, vertex u comes before v (Kahn's algorithm using indegree BFS).

Core Invariant: Kahn's Algorithm: Any node with `indegree == 0` has no remaining prerequisites and can be processed immediately. When processed, decrement indegrees of all outgoing neighbors; new 0-indegree nodes become eligible.

Recognize it (Keywords & Signals)
  • Task prerequisite scheduling / course schedule
  • Compilation dependency order
  • Build system build sequence
  • Detect cycle in directed graph
  • Alien dictionary (derive alphabet ordering)
When NOT to use

Undirected graphs (use standard BFS/DFS or DSU) or graphs known to contain self-loops/cycles where no order can exist.

How to solve (Step-by-step)
  1. 1.Build adjacency list `graph` and calculate `indegree` array/map for all nodes.
  2. 2.Enqueue all nodes with `indegree == 0` into a `queue`.
  3. 3.Initialize `order = []`.
  4. 4.While queue: pop `curr`, append to `order`. For each neighbor `nxt` of `curr`, decrement `indegree[nxt] -= 1`.
  5. 5.If `indegree[nxt] == 0`, enqueue `nxt`.
  6. 6.Cycle check: if `len(order) == num_nodes`, a valid topological order exists; otherwise, a directed cycle was present!
Watch for (Interview Traps)
  • Reversing edge directions (e.g. `[a, b]` direction is `b -> a`, not `a -> b`)
  • Failing to detect cycles by assuming all nodes are processed
  • Disconnected nodes: ensure all vertices `0..n-1` are registered in the indegree table
Kahn's Algorithm (BFS Indegree Topological Sort)
from collections import deque, defaultdict

def topological_sort(num_courses: int, prerequisites: list[list[int]]) -> list[int]:
    graph = defaultdict(list)
    indegrees = [0] * num_courses
    
    # Prerequisite [a, b] means: must take b before a (edge: b -> a)
    for course, prereq in prerequisites:
        graph[prereq].append(course)
        indegrees[course] += 1
        
    # Start with all nodes having zero prerequisites
    queue = deque([i for i in range(num_courses) if indegrees[i] == 0])
    order = []
    
    while queue:
        curr = queue.popleft()
        order.append(curr)
        
        for next_course in graph[curr]:
            indegrees[next_course] -= 1
            if indegrees[next_course] == 0:
                queue.append(next_course)
                
    # If order doesn't include all courses, a cycle exists
    return order if len(order) == num_courses else []
Cost
O(V + E) linear scan of nodes and dependency edges · O(V + E) graph + queue (Optimal linear time dependency resolution.)
Canonical problems
#207 Course Schedule: Detect if prerequisites form a cycle (len(order) == n)
#210 Course Schedule II: Return the actual linear order of courses
#269 Alien Dictionary: Derive character edge directions from adjacent words and sort
#310 Minimum Height Trees: Repeatedly trim leaves (degree 1) inward toward the center
Medium·50 companies·Max freq 100%·Acc 51.8%
ZenefitsGravitonYelp+47
Medium·39 companies·Max freq 100%·Acc 55.9%
ZenefitsinstabaseSnowflake+36
Hard·24 companies·Max freq 100%·Acc 37.3%
XPocket GemsUber+21
Hard·20 companies·Max freq 93%·Acc 56.8%
DoorDashWeRideDuolingo+17
Hard·13 companies·Max freq 100%·Acc 39.5%
LucidCiscoGraviton+10
Hard·10 companies·Max freq 100%·Acc 66.8%
SnowflakeAckoTwo Sigma+7
Medium·10 companies·Max freq 92%·Acc 57.0%
VerilyZeta GlobalDocusign+7
Hard·9 companies·Max freq 100%·Acc 39.6%
RampAirbnbRippling+6
Easy·8 companies·Max freq 88%·Acc 56.0%
WixAndurilUber+5
Medium·7 companies·Max freq 100%·Acc 42.6%
StacklineSplunkGoogle+4
Hard·7 companies·Max freq 88%·Acc 50.9%
JuspayPhonePeAnduril+4
Medium·7 companies·Max freq 81%·Acc 62.3%
NetflixSnowflakeUber+4
Medium·7 companies·Max freq 65%·Acc 63.8%
PhonePePayPalFlipkart+4
Medium·7 companies·Max freq 50%·Acc 71.2%
CitadelAmazonGoogle+4
Medium·7 companies·Max freq 39%·Acc 61.3%
TikTokSalesforceMeta+4
Hard·6 companies·Max freq 100%·Acc 41.9%
Works ApplicationsSalesforceAmazon+3
Hard·6 companies·Max freq 100%·Acc 0.5%
Hudson River TradingHudson River TradingTarget+3
Medium·6 companies·Max freq 50%·Acc 60.0%
TikTokUberAmazon+3
Hard·5 companies·Max freq 60%·Acc 61.8%
NutanixMicrosoftOracle+2
Hard·5 companies·Max freq 56%·Acc 57.2%
JuspayLinkedInGoogle+2
Hard·5 companies·Max freq 56%·Acc 66.0%
CitadelMetaAmazon+2
Medium·5 companies·Max freq 25%·Acc 37.6%
MetaAmazonGoogle+2
Medium·4 companies·Max freq 63%·Acc 62.3%
OracleGoogleAmazon+1
Hard·3 companies·Max freq 56%·Acc 42.4%
CitadelGoogleMeta
Hard·2 companies·Max freq 88%·Acc 57.3%
AdobeMicrosoft
Hard·2 companies·Max freq 38%·Acc 73.9%
OracleMicrosoft
Medium·2 companies·Max freq 38%·Acc 31.0%
GoogleAmazon
Hard·2 companies·Max freq 13%·Acc 50.9%
AmazonBloomberg
Hard·1 companies·Max freq 100%·Acc 31.1%
BNY Mellon
Hard·1 companies·Max freq 100%·Acc 22.8%
PhonePe
Hard·1 companies·Max freq 88%·Acc 51.8%
Adobe
Hard·1 companies·Max freq 75%·Acc 44.7%
DE Shaw
Medium·1 companies·Max freq 43%·Acc 77.9%
Google
Hard·1 companies·Max freq 25%·Acc 40.4%
Google
Medium·1 companies·Max freq 25%·Acc 41.5%
Google
Hard·1 companies·Max freq 25%·Acc 79.3%
Google
Medium·1 companies·Max freq 25%·Acc 37.3%
Google
Hard·1 companies·Max freq 25%·Acc 61.1%
Google
Hard·1 companies·Max freq 25%·Acc 70.1%
Google
Showing 39 of 39 problems in Topological Sort (Kahn's & DFS)Filtered: All Companies