Bird
Raised Fist0
Interview Preptopological-sortmediumAmazonGoogle

Find Eventual Safe States

Choose your preparation mode4 modes available
</>
IDE
def eventualSafeNodes(graph: List[List[int]]) -> List[int]:public List<Integer> eventualSafeNodes(List<List<Integer>> graph)vector<int> eventualSafeNodes(vector<vector<int>>& graph)function eventualSafeNodes(graph)
def eventualSafeNodes(graph):
    # Write your solution here
    pass
class Solution {
    public List<Integer> eventualSafeNodes(List<List<Integer>> graph) {
        // Write your solution here
        return new ArrayList<>();
    }
}
#include <vector>
using namespace std;

vector<int> eventualSafeNodes(vector<vector<int>>& graph) {
    // Write your solution here
    return {};
}
function eventualSafeNodes(graph) {
    // Write your solution here
}
Coming soon
0/10
Common Bugs to Avoid
Wrong: [0,1,2,3,4,5,6]Returning all nodes as safe without detecting cycles.✅ Implement cycle detection by reversing graph and using Kahn's algorithm to exclude cyclic nodes.
Wrong: [0]Only terminal nodes detected as safe, missing other safe nodes reachable to terminal nodes.✅ Use BFS on reversed graph starting from terminal nodes to find all safe nodes.
Wrong: [0]Fails to detect self-loop as cycle, marking node as safe incorrectly.✅ Detect self-loops explicitly or via cycle detection in reversed graph.
Wrong: []Fails to identify safe nodes in acyclic graphs, returning empty list.✅ Ensure nodes with zero out-degree and those reachable from them are included as safe.
✓
Test Cases
t1_01basic
Input{"graph":[[1,2],[2,3],[5],[0],[5],[],[]]}
Expected[2,4,5,6]

Nodes 2,4,5,6 are safe because starting from them, all paths lead to terminal nodes or safe nodes. For example, node 2 leads to node 5 which is terminal.

t1_02basic
Input{"graph":[[1],[2],[3],[4],[]]}
Expected[0,1,2,3,4]

All nodes lead to node 4 which is terminal, so all nodes are safe.

t2_01edge
Input{"graph":[]}
Expected[]

Empty graph has no nodes, so no safe nodes.

t2_02edge
Input{"graph":[[]]}
Expected[0]

Single node with no outgoing edges is terminal and thus safe.

t2_03edge
Input{"graph":[[0]]}
Expected[]

Single node with a self-loop forms a cycle, so no safe nodes.

t2_04edge
Input{"graph":[[1],[],[1]]}
Expected[0,1,2]

Node 1 is terminal, node 2 leads to 1, node 0 leads to 1. All nodes lead only to terminal or safe nodes, so nodes 0,1,2 are safe.

t3_01corner
Input{"graph":[[1],[2],[0]]}
Expected[]

All nodes form a cycle, so no safe nodes.

t3_02corner
Input{"graph":[[1,2],[2],[3],[1]]}
Expected[]

Graph contains a cycle between nodes 1,2,3; no safe nodes.

t3_03corner
Input{"graph":[[1],[2],[3],[]]}
Expected[0,1,2,3]

Linear chain ending in terminal node; all nodes safe.

t4_01performance
Input{"graph":[[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31],[32],[33],[34],[35],[36],[37],[38],[39],[40],[41],[42],[43],[44],[45],[46],[47],[48],[49],[50],[51],[52],[53],[54],[55],[56],[57],[58],[59],[60],[61],[62],[63],[64],[65],[66],[67],[68],[69],[70],[71],[72],[73],[74],[75],[76],[77],[78],[79],[80],[81],[82],[83],[84],[85],[86],[87],[88],[89],[90],[91],[92],[93],[94],[95],[96],[97],[98],[99],[100],[101],[102],[103],[104],[105],[106],[107],[108],[109],[110],[111],[112],[113],[114],[115],[116],[117],[118],[119],[120],[121],[122],[123],[124],[125],[126],[127],[128],[129],[130],[131],[132],[133],[134],[135],[136],[137],[138],[139],[140],[141],[142],[143],[144],[145],[146],[147],[148],[149],[150],[151],[152],[153],[154],[155],[156],[157],[158],[159],[160],[161],[162],[163],[164],[165],[166],[167],[168],[169],[170],[171],[172],[173],[174],[175],[176],[177],[178],[179],[180],[181],[182],[183],[184],[185],[186],[187],[188],[189],[190],[191],[192],[193],[194],[195],[196],[197],[198],[199],[200],[201],[202],[203],[204],[205],[206],[207],[208],[209],[210],[211],[212],[213],[214],[215],[216],[217],[218],[219],[220],[221],[222],[223],[224],[225],[226],[227],[228],[229],[230],[231],[232],[233],[234],[235],[236],[237],[238],[239],[240],[241],[242],[243],[244],[245],[246],[247],[248],[249],[250],[251],[252],[253],[254],[255],[256],[257],[258],[259],[260],[261],[262],[263],[264],[265],[266],[267],[268],[269],[270],[271],[272],[273],[274],[275],[276],[277],[278],[279],[280],[281],[282],[283],[284],[285],[286],[287],[288],[289],[290],[291],[292],[293],[294],[295],[296],[297],[298],[299],[300],[301],[302],[303],[304],[305],[306],[307],[308],[309],[310],[311],[312],[313],[314],[315],[316],[317],[318],[319],[320],[321],[322],[323],[324],[325],[326],[327],[328],[329],[330],[331],[332],[333],[334],[335],[336],[337],[338],[339],[340],[341],[342],[343],[344],[345],[346],[347],[348],[349],[350],[351],[352],[353],[354],[355],[356],[357],[358],[359],[360],[361],[362],[363],[364],[365],[366],[367],[368],[369],[370],[371],[372],[373],[374],[375],[376],[377],[378],[379],[380],[381],[382],[383],[384],[385],[386],[387],[388],[389],[390],[391],[392],[393],[394],[395],[396],[397],[398],[399],[400],[401],[402],[403],[404],[405],[406],[407],[408],[409],[410],[411],[412],[413],[414],[415],[416],[417],[418],[419],[420],[421],[422],[423],[424],[425],[426],[427],[428],[429],[430],[431],[432],[433],[434],[435],[436],[437],[438],[439],[440],[441],[442],[443],[444],[445],[446],[447],[448],[449],[450],[451],[452],[453],[454],[455],[456],[457],[458],[459],[460],[461],[462],[463],[464],[465],[466],[467],[468],[469],[470],[471],[472],[473],[474],[475],[476],[477],[478],[479],[480],[481],[482],[483],[484],[485],[486],[487],[488],[489],[490],[491],[492],[493],[494],[495],[496],[497],[498],[499],[500],[501],[502],[503],[504],[505],[506],[507],[508],[509],[510],[511],[512],[513],[514],[515],[516],[517],[518],[519],[520],[521],[522],[523],[524],[525],[526],[527],[528],[529],[530],[531],[532],[533],[534],[535],[536],[537],[538],[539],[540],[541],[542],[543],[544],[545],[546],[547],[548],[549],[550],[551],[552],[553],[554],[555],[556],[557],[558],[559],[560],[561],[562],[563],[564],[565],[566],[567],[568],[569],[570],[571],[572],[573],[574],[575],[576],[577],[578],[579],[580],[581],[582],[583],[584],[585],[586],[587],[588],[589],[590],[591],[592],[593],[594],[595],[596],[597],[598],[599],[600],[601],[602],[603],[604],[605],[606],[607],[608],[609],[610],[611],[612],[613],[614],[615],[616],[617],[618],[619],[620],[621],[622],[623],[624],[625],[626],[627],[628],[629],[630],[631],[632],[633],[634],[635],[636],[637],[638],[639],[640],[641],[642],[643],[644],[645],[646],[647],[648],[649],[650],[651],[652],[653],[654],[655],[656],[657],[658],[659],[660],[661],[662],[663],[664],[665],[666],[667],[668],[669],[670],[671],[672],[673],[674],[675],[676],[677],[678],[679],[680],[681],[682],[683],[684],[685],[686],[687],[688],[689],[690],[691],[692],[693],[694],[695],[696],[697],[698],[699],[700],[701],[702],[703],[704],[705],[706],[707],[708],[709],[710],[711],[712],[713],[714],[715],[716],[717],[718],[719],[720],[721],[722],[723],[724],[725],[726],[727],[728],[729],[730],[731],[732],[733],[734],[735],[736],[737],[738],[739],[740],[741],[742],[743],[744],[745],[746],[747],[748],[749],[750],[751],[752],[753],[754],[755],[756],[757],[758],[759],[760],[761],[762],[763],[764],[765],[766],[767],[768],[769],[770],[771],[772],[773],[774],[775],[776],[777],[778],[779],[780],[781],[782],[783],[784],[785],[786],[787],[788],[789],[790],[791],[792],[793],[794],[795],[796],[797],[798],[799],[800],[801],[802],[803],[804],[805],[806],[807],[808],[809],[810],[811],[812],[813],[814],[815],[816],[817],[818],[819],[820],[821],[822],[823],[824],[825],[826],[827],[828],[829],[830],[831],[832],[833],[834],[835],[836],[837],[838],[839],[840],[841],[842],[843],[844],[845],[846],[847],[848],[849],[850],[851],[852],[853],[854],[855],[856],[857],[858],[859],[860],[861],[862],[863],[864],[865],[866],[867],[868],[869],[870],[871],[872],[873],[874],[875],[876],[877],[878],[879],[880],[881],[882],[883],[884],[885],[886],[887],[888],[889],[890],[891],[892],[893],[894],[895],[896],[897],[898],[899],[900],[901],[902],[903],[904],[905],[906],[907],[908],[909],[910],[911],[912],[913],[914],[915],[916],[917],[918],[919],[920],[921],[922],[923],[924],[925],[926],[927],[928],[929],[930],[931],[932],[933],[934],[935],[936],[937],[938],[939],[940],[941],[942],[943],[944],[945],[946],[947],[948],[949],[950],[951],[952],[953],[954],[955],[956],[957],[958],[959],[960],[961],[962],[963],[964],[965],[966],[967],[968],[969],[970],[971],[972],[973],[974],[975],[976],[977],[978],[979],[980],[981],[982],[983],[984],[985],[986],[987],[988],[989],[990],[991],[992],[993],[994],[995],[996],[997],[998],[999],[]]}
⏱ Performance - must finish in 2000ms

Large linear chain graph with n=1000 nodes; O(V+E) solution must complete within 2 seconds.

Practice

(1/5)
1. You are given a list of words sorted lexicographically in an unknown language. Your task is to determine the order of characters in this alien language. Which algorithmic approach guarantees an optimal solution to infer the character order from these constraints?
easy
A. Topological sort on a directed graph constructed from character precedence relations inferred from adjacent words
B. Greedy algorithm that picks the first differing character between adjacent words and orders them immediately
C. Dynamic programming to find the longest common subsequence between all pairs of words
D. Brute force comparison of all pairs of words to deduce character order by frequency

Solution

  1. Step 1: Understand problem constraints

    The problem requires inferring a partial order of characters based on lexicographical ordering of words, which naturally forms a directed graph of precedence relations.
  2. Step 2: Identify suitable algorithm

    Topological sort is the standard algorithm to find a linear order of nodes in a directed acyclic graph (DAG), which fits perfectly to infer character order from precedence edges.
  3. Final Answer:

    Option A -> Option A
  4. Quick Check:

    Topological sort handles partial orders and cycles correctly [OK]
Hint: Partial order inference -> topological sort [OK]
Common Mistakes:
  • Assuming greedy approach works without cycle detection
  • Confusing longest common subsequence with order inference
  • Using brute force frequency counts which ignore order
2. Consider the following buggy code snippet for topological sort positions. Which line contains the subtle bug that can cause incorrect matrix construction?
medium
A. Line where graph[u].append(v) is called
B. Line where queue is initialized with nodes of zero in-degree
C. Line where pos[node] is assigned idx
D. Line where in_degree[u] is incremented instead of in_degree[v]

Solution

  1. Step 1: Identify how in-degree is updated

    In-degree should count incoming edges; incrementing in_degree[u] is incorrect because u is the source, not the target.
  2. Step 2: Understand impact of bug

    Incorrect in-degree counts cause wrong zero in-degree nodes, breaking topological order and matrix correctness.
  3. Final Answer:

    Option D -> Option D
  4. Quick Check:

    Correct in-degree update is critical for cycle detection and ordering [OK]
Hint: In-degree counts incoming edges, not outgoing [OK]
Common Mistakes:
  • Mixing source and target when updating in-degree
  • Assuming graph edges are undirected
3. What is the time complexity of Kahn's Algorithm for finding a topological order in a graph with V vertices and E edges?
medium
A. O(V * E) because each vertex processes all edges repeatedly.
B. O(V^2) because in-degree updates require scanning all vertices.
C. O(V + E) because each vertex and edge is processed exactly once.
D. O(E log V) due to priority queue operations for ordering.

Solution

  1. Step 1: Identify operations on vertices and edges

    Each vertex is enqueued and dequeued once; each edge is visited once to decrement in-degree.
  2. Step 2: Sum total work

    Processing all vertices and edges once leads to O(V + E) time complexity.
  3. Final Answer:

    Option C -> Option C
  4. Quick Check:

    Linear time in graph size is standard for BFS topological sort [OK]
Hint: Each edge and vertex processed once -> O(V + E) [OK]
Common Mistakes:
  • Assuming nested loops cause O(V*E)
  • Confusing in-degree updates as scanning all vertices
  • Thinking priority queues are used by default
4. The following code attempts to compute the minimum semesters to complete all courses using BFS topological sort. Identify the bug that causes incorrect results or infinite loops.
from collections import deque, defaultdict

def min_semesters_buggy(n, relations):
    graph = defaultdict(list)
    indegree = [0] * (n + 1)
    for u, v in relations:
        graph[u].append(v)
        indegree[v] += 1

    queue = deque([i for i in range(1, n + 1) if indegree[i] == 0])
    semester = 0
    processed = 0

    while queue:
        semester += 1
        course = queue.popleft()  # Bug here: processing one course per semester
        processed += 1
        for nei in graph[course]:
            indegree[nei] -= 1
            if indegree[nei] == 0:
                queue.append(nei)

    return semester if processed == n else -1
medium
A. Line with 'semester += 1' increments semester too early.
B. Line with 'course = queue.popleft()' processes only one course per semester instead of all available.
C. Line with 'indegree[nei] -= 1' incorrectly decrements indegree causing negative values.
D. Line with 'queue = deque(...)' initializes queue incorrectly missing some zero indegree courses.

Solution

  1. Step 1: Identify how courses are processed per semester

    The code processes only one course per semester by popping one element from the queue.
  2. Step 2: Understand impact on semester count

    Since multiple courses with zero indegree can be taken in parallel, processing one at a time inflates semester count incorrectly.
  3. Final Answer:

    Option B -> Option B
  4. Quick Check:

    Correct BFS processes all zero indegree nodes per semester [OK]
Hint: Process all zero indegree courses per semester, not one [OK]
Common Mistakes:
  • Incrementing semester inside inner loop
  • Not processing all available courses in one semester
  • Incorrect indegree updates causing infinite loops
5. Examine the following buggy code snippet for sequence reconstruction using DFS postorder topological sort. Which line contains the subtle bug that can cause incorrect results when seqs is missing some elements from org?
medium
A. Line 7: Missing check if all nodes in org appear in seqs
B. Line 12: Incorrect graph edge insertion logic
C. Line 18: Incorrect cycle detection marking
D. Line 27: Missing stack reversal before comparison

Solution

  1. Step 1: Identify missing validation

    The code does not check if all elements in org appear in seqs, which can cause false positives.
  2. Step 2: Confirm other lines are correct

    Graph construction, cycle detection, and stack reversal are implemented correctly.
  3. Final Answer:

    Option A -> Option A
  4. Quick Check:

    Missing node presence check leads to incorrect true when seqs incomplete [OK]
Hint: Always verify all org nodes appear in seqs [OK]
Common Mistakes:
  • Ignoring node presence check
  • Misplacing cycle detection flags
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard