@@ -2,42 +2,32 @@ package g0201_0300.s0207_course_schedule
2
2
3
3
// #Medium #Top_100_Liked_Questions #Top_Interview_Questions #Depth_First_Search
4
4
// #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%)
8
6
9
7
object Solution {
10
- val WHITE = 0
11
- val GRAY = 1
12
- val BLACK = 2
13
-
14
8
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
27
17
}
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
+ }
38
29
}
39
30
}
40
- colors(node) = BLACK
41
- false
31
+ courseTaken == numCourses
42
32
}
43
33
}
0 commit comments