File tree Expand file tree Collapse file tree 1 file changed +45
-0
lines changed
Expand file tree Collapse file tree 1 file changed +45
-0
lines changed Original file line number Diff line number Diff line change 1+ // TC: O(V + E), V = numCourses, E = prerequisites.length
2+ // SC: O(V + E)
3+
4+ function canFinish ( numCourses : number , prerequisites : number [ ] [ ] ) : boolean {
5+ // 0: [1]
6+ // 1: []
7+
8+ const graph = new Map < number , number [ ] > ( ) ;
9+
10+ // Initialize all courses
11+ for ( let i = 0 ; i < numCourses ; i ++ ) {
12+ graph . set ( i , [ ] ) ;
13+ }
14+
15+ // Build the graph
16+ for ( const [ crs , pre ] of prerequisites ) {
17+ graph . get ( crs ) ! . push ( pre ) ;
18+ }
19+
20+ const traversing = new Set < number > ( ) ;
21+ const finished = new Set < number > ( ) ;
22+
23+ const canFinish = ( crs : number ) : boolean => {
24+ if ( traversing . has ( crs ) ) return false ; // cycle detected
25+
26+ if ( finished . has ( crs ) ) return true ; // already visited
27+
28+ traversing . add ( crs ) ;
29+
30+ for ( const pre of graph . get ( crs ) ! ) {
31+ if ( ! canFinish ( pre ) ) return false ;
32+ }
33+
34+ traversing . delete ( crs ) ;
35+ finished . add ( crs ) ;
36+
37+ return true ;
38+ } ;
39+
40+ for ( const crs of graph . keys ( ) ) {
41+ if ( ! canFinish ( crs ) ) return false ;
42+ }
43+
44+ return true ;
45+ }
You can’t perform that action at this time.
0 commit comments