zoukankan      html  css  js  c++  java
  • 11/11 <Topological Sort> 207

    207. Course Schedule

    我们定义二维数组 graph 来表示这个有向图,一维数组 in 来表示每个顶点的入度。我们开始先根据输入来建立这个有向图,并将入度数组也初始化好。然后我们定义一个 queue 变量,将所有入度为0的点放入队列中,然后开始遍历队列,从 graph 里遍历其连接的点,每到达一个新节点,将其入度减一,如果此时该点入度为0,则放入队列末尾。直到遍历完队列中所有的值,若此时还有节点的入度不为0,则说明环存在,返回 false,反之则返回 true

    inDegree[]: 修该门课程的入度,即先修课数量;

    class Solution {
        public boolean canFinish(int numCourses, int[][] prerequisites) {
            int[] inDegree = new int[numCourses];
            Map<Integer, List<Integer>> graph = new HashMap<>();
            //Graph: key->课程 value->所需先修课列表
            //inDegree[] 下标对应课程,value为对应的入度
            for(int i = 0; i < prerequisites.length; i++){
                inDegree[prerequisites[i][0]]++;
                if(graph.containsKey(prerequisites[i][1])){
                    graph.get(prerequisites[i][1]).add(prerequisites[i][0]);
                }else{
                    ArrayList<Integer> list = new ArrayList<>();
                    list.add(prerequisites[i][0]);
                    graph.put(prerequisites[i][1], list);
                }
            }
            
            Queue<Integer> queue = new LinkedList<>();
            for(int i = 0; i < numCourses; i++){
                if(inDegree[i] == 0) queue.add(i);
            }
            
            while(!queue.isEmpty()){
                int cur = queue.poll();
                List<Integer> toTake = graph.get(cur);
                for(int i = 0; toTake != null && i < toTake.size(); i++){
                    inDegree[toTake.get(i)]--;
                    if(inDegree[toTake.get(i)] == 0) queue.add(toTake.get(i));
                }
            }
            
            for(int i = 0; i <numCourses; i++){
                if(inDegree[i] != 0) return false;
            }
            return true;
        }
    }

    210. Course Schedule II

    用Order[]来存储路线

    class Solution {
        public int[] findOrder(int numCourses, int[][] prerequisites) {
            if(numCourses == 0) return null;
            
            int inDegree[] = new int[numCourses], order[] = new int[numCourses], index = 0;
            for(int i = 0; i < prerequisites.length; i++){
                inDegree[prerequisites[i][0]]++;
            }
            
            Queue<Integer> queue = new LinkedList<Integer>();
            for(int i = 0; i < numCourses; i++){
                if(inDegree[i] == 0){
                    order[index++] = i;
                    queue.offer(i);
                }
            }
            
            while(!queue.isEmpty()){
                int cur = queue.poll();
                for(int i = 0; i < prerequisites.length; i++){
                    if(prerequisites[i][1] == cur){
                        inDegree[prerequisites[i][0]]--;
                        if(inDegree[prerequisites[i][0]] == 0){
                            //If inDegree is zero, then add the course to the order
                            order[index++] = prerequisites[i][0];
                            queue.offer(prerequisites[i][0]);
                        }
                    }
                }
            }
            return (index == numCourses) ? order : new int[0];
        }
    }
  • 相关阅读:
    java.io.IOException: Premature EOF
    springmvc集成shiro例子
    eclipse调试(debug)的时候,出现Source not found,Edit Source Lookup Path,一闪而过
    【译】Core Java Questions and Answers【1-33】
    Spring bean依赖注入、bean的装配及相关注解
    【译】Spring 4 基于TaskScheduler实现定时任务(注解)
    【译】Spring 4 + Hibernate 4 + Mysql + Maven集成例子(注解 + XML)
    【译】Spring 4 @Profile注解示例
    【译】Spring 4 @PropertySource和@Value注解示例
    【译】Spring 4 自动装配、自动检测、组件扫描示例
  • 原文地址:https://www.cnblogs.com/Afei-1123/p/11835383.html
Copyright © 2011-2022 走看看