88
99 class CourseSchedule {
1010 func canFinish( _ numCourses: Int , _ prerequisites: [ [ Int ] ] ) -> Bool {
11- var inDegrees = Array ( repeating: 0 , count: numCourses) , fromTo = [ Int: [ Int] ] ( )
12- var coursesCouldTake = [ Int] ( ) , queue = [ Int] ( )
11+ var inDegrees = Array ( repeating: 0 , count: numCourses) , toCourses = [ Int: [ Int] ] ( )
1312
14- // init graph
15- for prerequisite in prerequisites {
16- fromTo [ prerequisite [ 1 ] , default: [ ] ] . append ( prerequisite [ 0 ] )
17- inDegrees [ prerequisite [ 0 ] ] += 1
13+ for courses in prerequisites {
14+ inDegrees [ courses [ 0 ] ] += 1
15+ toCourses [ courses [ 1 ] , default: [ ] ] . append ( courses [ 0 ] )
1816 }
1917
20- // BFS
21- for course in 0 ..< numCourses {
22- if inDegrees [ course] == 0 {
23- queue. append ( course)
24- }
25- }
18+ var queue = ( 0 ..< numCourses) . filter { inDegrees [ $0] == 0 } , validCourseCount = 0
2619
2720 while !queue. isEmpty {
28- let currentCourse = queue. removeFirst ( )
29- coursesCouldTake. append ( currentCourse)
21+ let course = queue. removeFirst ( )
3022
31- guard let toCourses = fromTo [ currentCourse] else {
23+ validCourseCount += 1
24+
25+ guard let toCourses = toCourses [ course] else {
3226 continue
3327 }
3428
35- toCourses. forEach {
36- inDegrees [ $0] -= 1
37-
38- if inDegrees [ $0] == 0 {
39- queue. append ( $0)
29+ for toCourse in toCourses {
30+ inDegrees [ toCourse] -= 1
31+ if inDegrees [ toCourse] == 0 {
32+ queue. append ( toCourse)
4033 }
4134 }
4235 }
43-
44- return coursesCouldTake . count == numCourses
36+
37+ return validCourseCount == numCourses
4538 }
4639}
0 commit comments