• Course Schedule


    There are a total of n courses you have to take, labeled from 0 to n - 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?

    For example:

    2, [[1,0]]

    There are a total of 2 courses to take. To take course 1 you should have finished course 0. So it is possible.

    2, [[1,0],[0,1]]

    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.

    click to show more hints.

    Hints:
    1. This problem is equivalent to finding if a cycle exists in a directed graph. If a cycle exists, no topological ordering exists and therefore it will be impossible to take all courses.
    2. There are several ways to represent a graph. For example, the input prerequisites is a graph represented by a list of edges. Is this graph representation appropriate?
    3. Topological Sort via DFS - A great video tutorial (21 minutes) on Coursera explaining the basic concepts of Topological Sort.
    4. Topological sort could also be done via BFS.

    这题的重点在于找到不depend on any node的node, 然后一层一层的降depend。 

    时间复杂度是O(n^2) n为node的个数

    空间复杂度是O(e) e 为depend 的个数(即: 边数)

     1 public class Solution {
     2     public boolean canFinish(int numCourses, int[][] prerequisites) {
     3         if(prerequisites == null || prerequisites.length == 0 || prerequisites[0].length != 2){
     4             return true;
     5         }
     6         int[] depend = new int[numCourses];//node[i] depends on depend[i] # of nodes
     7         //arraylist of node depends on node key
     8         HashMap<Integer, ArrayList<Integer>> mapping = new HashMap<Integer, ArrayList<Integer>>();
     9         for(int i = 0; i < prerequisites.length; i ++){
    10             depend[prerequisites[i][0]] ++;
    11             if(mapping.containsKey(prerequisites[i][1])){
    12                 mapping.get(prerequisites[i][1]).add(prerequisites[i][0]);
    13             }else{
    14                 ArrayList<Integer> list = new ArrayList<Integer>();
    15                 list.add(prerequisites[i][0]);
    16                 mapping.put(prerequisites[i][1], list);
    17             }
    18         }
    19         while(mapping.size() != 0){
    20             boolean flg = false;
    21             for(int i = 0; i < numCourses; i ++){
    22                 if(depend[i] == 0 && mapping.containsKey(i)){
    23                     //this node doesn't depend on any node, but some node depend on it
    24                     flg = true;
    25                     for(Integer pos : mapping.get(i)){
    26                         depend[pos] --;
    27                     }
    28                     mapping.remove(i);
    29                 }
    30             }
    31             if(flg == false){
    32                 return false;
    33             }
    34         }
    35         return true;
    36     }
    37 }
  • 相关阅读:
    小程序 图片和文字放在一行对齐的方法
    Linux下Redis安装使用教程
    关系型数据库和非关系型数据库的区别
    微信小程序scroll-view 横向和纵向scroll-view组件
    ThinkPHP5.0手把手实现手机阿里云短信验证
    极验(Geetest) Laravel 5 集成开发包,让验证更安全
    (进阶篇)PHP(thinkphp5框架)实现用户注册后邮箱验证,激活帐号
    详解PhpSpreadsheet设置单元格
    使用PhpSpreadsheet将Excel导入到MySQL数据库
    【JZOJ4783】【NOIP2016提高A组模拟9.15】Osu
  • 原文地址:https://www.cnblogs.com/reynold-lei/p/4484424.html
Copyright © 2020-2023  润新知