24
24
* @return {number[] }
25
25
*/
26
26
let findOrder = function ( numCourses , prerequisites ) {
27
- let prelen = prerequisites . length ,
28
- maxNoCircle = numCourses * ( numCourses - 1 ) / 2 ;
29
- // 当所有点都有边连接时, 最大的无环边数
30
- if ( prelen > maxNoCircle ) {
31
- return [ ] ;
32
- }
27
+ let prelen = prerequisites . length ,
28
+ maxNoCircle = numCourses * ( numCourses - 1 ) / 2 ;
29
+ // 当所有点都有边连接时, 最大的无环边数
30
+ if ( prelen > maxNoCircle ) {
31
+ return [ ] ;
32
+ }
33
33
34
- let queue = [ ] , // 存储 BFS 待访问节点序列
35
- flags = [ ] , // 存储节点是否被访问过的标记
36
- res = [ ] , //结果
37
- nodedegree = new Array ( numCourses ) , // 存储node的连边总数
38
- edges = new Array ( numCourses ) ; // 存储连边信息, 每个元素中存储的数组表示自己的后续课程
39
- for ( let i = 0 ; i < numCourses ; i ++ ) {
40
- flags [ i ] = false ;
41
- nodedegree [ i ] = 0 ;
42
- edges [ i ] = [ ] ;
43
- }
34
+ let queue = [ ] , // 存储 BFS 待访问节点序列
35
+ flags = [ ] , // 存储节点是否被访问过的标记
36
+ res = [ ] , //结果
37
+ nodedegree = new Array ( numCourses ) , // 存储node的连边总数
38
+ edges = new Array ( numCourses ) ; // 存储连边信息, 每个元素中存储的数组表示自己的后续课程
39
+ for ( let i = 0 ; i < numCourses ; i ++ ) {
40
+ flags [ i ] = false ;
41
+ nodedegree [ i ] = 0 ;
42
+ edges [ i ] = [ ] ;
43
+ }
44
44
45
- for ( let i = 0 ; i < prelen ; i ++ ) {
46
- let source = prerequisites [ i ] [ 0 ] ,
47
- target = prerequisites [ i ] [ 1 ] ;
45
+ for ( let i = 0 ; i < prelen ; i ++ ) {
46
+ let source = prerequisites [ i ] [ 0 ] ,
47
+ target = prerequisites [ i ] [ 1 ] ;
48
48
49
- edges [ target ] . push ( source ) ;
50
- nodedegree [ source ] ++ ;
51
- nodedegree [ target ] ++ ;
52
- }
53
-
54
- for ( let i = 0 ; i < numCourses ; i ++ ) {
55
- if ( nodedegree [ i ] === edges [ i ] . length ) {
56
- queue . push ( i ) ;
57
- }
58
- }
59
-
60
- if ( bfsVisit ( ) ) {
61
- return res ;
62
- } else {
63
- return [ ] ;
64
- }
65
-
66
- function bfsVisit ( ) {
67
- while ( queue . length ) {
68
- let current = queue . shift ( ) , //当前访问节点
69
- elen = edges [ current ] . length ; // 边数
70
-
71
- res . push ( current ) ;
72
- // console.log(current, res);
73
- flags [ current ] = true ;
74
- for ( let i = 0 ; i < elen ; i ++ ) {
75
- let target = edges [ current ] [ i ] ;
76
- if ( flags [ target ] ) {
77
- return false ; // 有回路,返回 false
78
- }
79
- if ( -- nodedegree [ target ] === edges [ target ] . length ) {
80
- queue . push ( target ) ;
81
- }
82
- }
83
- edges [ current ] = [ ] ;
84
- nodedegree [ current ] -= elen ;
85
- }
86
-
87
- if ( res . length < numCourses ) {
88
- return false ;
89
- }
90
- return true ;
91
- }
92
- } ;
49
+ edges [ target ] . push ( source ) ;
50
+ nodedegree [ source ] ++ ;
51
+ nodedegree [ target ] ++ ;
52
+ }
53
+
54
+ for ( let i = 0 ; i < numCourses ; i ++ ) {
55
+ if ( nodedegree [ i ] === edges [ i ] . length ) {
56
+ queue . push ( i ) ;
57
+ }
58
+ }
59
+
60
+ if ( bfsVisit ( ) ) {
61
+ return res ;
62
+ } else {
63
+ return [ ] ;
64
+ }
65
+
66
+ function bfsVisit ( ) {
67
+ while ( queue . length ) {
68
+ let current = queue . shift ( ) , //当前访问节点
69
+ elen = edges [ current ] . length ; // 边数
70
+
71
+ res . push ( current ) ;
72
+ // console.log(current, res);
73
+ flags [ current ] = true ;
74
+ for ( let i = 0 ; i < elen ; i ++ ) {
75
+ let target = edges [ current ] [ i ] ;
76
+ if ( flags [ target ] ) {
77
+ return false ; // 有回路,返回 false
78
+ }
79
+ if ( -- nodedegree [ target ] === edges [ target ] . length ) {
80
+ queue . push ( target ) ;
81
+ }
82
+ }
83
+ edges [ current ] = [ ] ;
84
+ nodedegree [ current ] -= elen ;
85
+ }
86
+
87
+ if ( res . length < numCourses ) {
88
+ return false ;
89
+ }
90
+ return true ;
91
+ }
92
+ } ;
0 commit comments