6
6
*
7
7
*/
8
8
9
- class CourseScheduleII {
9
+ class CourseScheduleII {
10
10
func findOrder( _ numCourses: Int , _ prerequisites: [ [ Int ] ] ) -> [ Int ] {
11
- var inDegrees = Array ( repeating: 0 , count: numCourses) , fromTo = [ Int: [ Int] ] ( )
12
- var coursesCouldTake = [ Int] ( )
13
-
14
- // init graph
15
- for prerequisite in prerequisites {
16
- fromTo [ prerequisite [ 1 ] , default: [ ] ] . append ( prerequisite [ 0 ] )
17
- inDegrees [ prerequisite [ 0 ] ] += 1
11
+ var indegrees = Array ( repeating: 0 , count: numCourses) , toCourses = [ Int: [ Int] ] ( )
12
+
13
+ for pres in prerequisites {
14
+ indegrees [ pres [ 0 ] ] += 1
15
+ toCourses [ pres [ 1 ] , default: [ ] ] . append ( pres [ 0 ] )
18
16
}
19
-
20
- var queue = ( 0 ..< numCourses) . filter { inDegrees [ $0] == 0 }
21
-
17
+
18
+ var queue = ( 0 ..< numCourses) . filter { indegrees [ $0] == 0 } , result = [ Int ] ( )
19
+
22
20
while !queue. isEmpty {
23
- let currentCourse = queue. removeFirst ( )
24
- coursesCouldTake. append ( currentCourse)
25
-
26
- guard let toCourses = fromTo [ currentCourse] else {
27
- continue
28
- }
29
-
30
- toCourses. forEach {
31
- inDegrees [ $0] -= 1
32
-
33
- if inDegrees [ $0] == 0 {
34
- queue. append ( $0)
21
+ let course = queue. removeFirst ( )
22
+
23
+ result. append ( course)
24
+
25
+ for toCourse in toCourses [ course] ?? [ ] {
26
+ indegrees [ toCourse] -= 1
27
+ if indegrees [ toCourse] == 0 {
28
+ queue. append ( toCourse)
35
29
}
36
30
}
37
31
}
38
-
39
- return coursesCouldTake . count == numCourses ? coursesCouldTake : [ Int] ( )
32
+
33
+ return result . count == numCourses ? result : [ Int] ( )
40
34
}
41
- }
35
+ }
0 commit comments