zoukankan      html  css  js  c++  java
  • 207. Course Schedule

    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 {
        /**
         * solution: BFS
         * Time complexity:O(n^2), Space complexity:O(n)
         * */
        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
        }
    }
  • 相关阅读:
    BZOJ_4320_ShangHai2006 Homework_分块
    BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集
    BZOJ_2788_[Poi2012]Festival_差分约束+tarjan+floyed
    BZOJ_2795_[Poi2012]A Horrible Poem_hash+暴力
    BZOJ_1598_[Usaco2008 Mar]牛跑步_A*
    [转载]java匿名对象
    [转载]static in Java
    Bat批处理文件入门
    在set中放入自定义类型
    [转载]C++STL概述
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/13216263.html
Copyright © 2011-2022 走看看