@@ -2,42 +2,32 @@ package g0201_0300.s0207_course_schedule
22
33// #Medium #Top_100_Liked_Questions #Top_Interview_Questions #Depth_First_Search
44// #Breadth_First_Search #Graph #Topological_Sort #Big_O_Time_O(N)_Space_O(N)
5- // #2023_11_05_Time_548_ms_(87.81%)_Space_60_MB_(12.20%)
6-
7- import scala .collection .mutable .ArrayBuffer
5+ // #2024_06_02_Time_720_ms_(91.11%)_Space_61.7_MB_(75.56%)
86
97object Solution {
10- val WHITE = 0
11- val GRAY = 1
12- val BLACK = 2
13-
148 def canFinish (numCourses : Int , prerequisites : Array [Array [Int ]]): Boolean = {
15- val adj = Array .fill(numCourses)(new ArrayBuffer [Int ]())
16- prerequisites.foreach { pre =>
17- adj(pre(1 )).append(pre(0 ))
18- }
19-
20- val colors = Array .fill(numCourses)(WHITE )
21- (0 until numCourses).forall { i =>
22- if (colors(i) == WHITE && adj(i).nonEmpty && hasCycle(adj, i, colors)) {
23- false
24- } else {
25- true
26- }
9+ import scala .collection .mutable .{Queue , ListBuffer }
10+ val indegree = Array .fill(numCourses)(0 )
11+ val graph = Array .fill(numCourses)(new ListBuffer [Int ])
12+ for (data <- prerequisites) {
13+ val course = data.head
14+ val prerequisiteCourse = data.last
15+ indegree(course) = indegree(course) + 1
16+ graph(prerequisiteCourse) += course
2717 }
28- }
29-
30- private def hasCycle (adj : Array [ArrayBuffer [Int ]], node : Int , colors : Array [Int ]): Boolean = {
31- colors(node) = GRAY
32- adj(node).foreach { nei =>
33- if (colors(nei) == GRAY ) {
34- return true
35- }
36- if (colors(nei) == WHITE && hasCycle(adj, nei, colors)) {
37- return true
18+ val startingCourses = indegree.zipWithIndex.filter(_._1.equals(0 )).map(_._2)
19+ val queue = Queue [Int ](startingCourses : _* )
20+ var courseTaken = 0
21+ while (queue.nonEmpty) {
22+ val current = queue.dequeue
23+ courseTaken = courseTaken + 1
24+ for (neighbor <- graph(current)) {
25+ indegree(neighbor) = indegree(neighbor) - 1
26+ if (indegree(neighbor).equals(0 )) {
27+ queue.enqueue(neighbor)
28+ }
3829 }
3930 }
40- colors(node) = BLACK
41- false
31+ courseTaken == numCourses
4232 }
4333}
0 commit comments