1+ /* *
2+ * https://leetcode.com/problems/course-schedule-ii/
3+ */
4+ class CourseScheduleTwo {
5+ fun findOrder (numCourses : Int , prerequisites : Array <IntArray >): IntArray {
6+ val courePrereqs = (0 until numCourses).map { Pair (it, mutableSetOf<Int >()) }.toMap().toMutableMap()
7+ val courseToListOfCoursesThatNeedIt = (0 until numCourses).map { Pair (it, mutableSetOf<Int >()) }.toMap().toMutableMap()
8+ prerequisites.forEach { desc ->
9+ val prereqList = mutableListOf<Int >()
10+ for (i in 1 until desc.size) {
11+ prereqList.add(desc[i])
12+ courseToListOfCoursesThatNeedIt.computeIfAbsent(desc[i]) { mutableSetOf ()}.add(desc[0 ])
13+ }
14+ courePrereqs.computeIfAbsent(desc[0 ]) { mutableSetOf ()}.addAll(prereqList)
15+ }
16+ val availableCourses = courePrereqs.filter { it.value.isEmpty() }.map { it.key }.toMutableList()
17+ availableCourses.forEach{
18+ courePrereqs.remove(it)
19+ }
20+ val courseSchedule = mutableListOf<Int >()
21+ val visited = availableCourses.toMutableSet()
22+ while (availableCourses.isNotEmpty()) {
23+ val current = availableCourses.removeAt(0 )
24+ courseSchedule.add(current)
25+ val toQueue = mutableListOf<Int >()
26+ courseToListOfCoursesThatNeedIt.getOrDefault(current, mutableSetOf ()).forEach {
27+ val preReqSet = courePrereqs[it]!!
28+ preReqSet.remove(current)
29+ if (preReqSet.isEmpty()) {
30+ courePrereqs.remove(it)
31+ toQueue.add(it)
32+
33+ }
34+ }
35+ availableCourses.addAll(toQueue)
36+
37+ }
38+ return if (courseSchedule.size != numCourses) intArrayOf() else courseSchedule.toIntArray()
39+
40+
41+
42+ }
43+ }
0 commit comments