package LeetCode_207 import java.util.* import kotlin.collections.ArrayList /** * 207. Course Schedule * https://leetcode.com/problems/course-schedule/description/ * There are a total of numCourses courses you have to take, labeled from 0 to numCourses-1. Some courses may have prerequisites, for example to take course 0 you have to first take course 1,which is expressed as a pair: [0,1] Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses? Example 1: Input: numCourses = 2, prerequisites = [[1,0]] Output: true Explanation: There are a total of 2 courses to take. Example 2: Input: numCourses = 2, prerequisites = [[1,0],[0,1]] Output: false Explanation: There are a total of 2 courses to take. To take course 1 you should have finished course 0, and to take course 0 you should also have finished course 1. So it is impossible. * */ class Solution { //bfs fun canFinish(numCourses: Int, prerequisites: Array<IntArray>): Boolean { val graph = ArrayList<ArrayList<Int>>() //create graph by prerequisites for (i in 0 until numCourses) { graph.add(ArrayList()) } for (item in prerequisites){ val start = item[1] val end = item[0] graph[start].add(end) } //calculate in degree val indegrees = IntArray(numCourses) for (g in graph){ for (item in g){ indegrees[item]++ } } val queue = LinkedList<Int>() for (i in 0 until numCourses) { if (indegrees[i]==0){ queue.offer(i) } } while (queue.isNotEmpty()){ val cur = queue.poll() for (item in graph[cur]){ indegrees[item]-- if (indegrees[item]==0){ queue.offer(item) } } } for (i in 0 until numCourses){ if (indegrees[i]!=0){ //represent graph got a cycle, so return false return false } } return true } }