zoukankan      html  css  js  c++  java
  • [LeetCode] 210. 课程表 II !!!!(图)

    输入的先决条件是由边缘列表表示的图形,而不是邻接矩阵。详情请参见图的表示法

    有想到用图,图还没细看过,正好看看。

    拓扑排序思路一步步形成,类BFS

    class Solution {
        public int[] findOrder(int numCourses, int[][] prerequisites) {
            int[] inDegree = new int[numCourses];
            HashMap<Integer, List<Integer>> map = new HashMap<>();
            Queue<Integer> queue = new LinkedList<>();
            for (int i = 0; i < prerequisites.length; i++) {
                inDegree[prerequisites[i][0]]++;
                if(map.containsKey(prerequisites[i][1])){
                    map.get(prerequisites[i][1]).add(prerequisites[i][0]);
                } else {
                    List<Integer> list = new ArrayList<>();
                    list.add(prerequisites[i][0]);
                    map.put(prerequisites[i][1], list);
                }
            }
            //遍历,将index入队
            List<Integer> res = new ArrayList<>();
            for (int i = 0; i < numCourses; i++) {
                if(inDegree[i] == 0){
                    queue.offer(i);
                }
            }
            // 出队,查哈希表,将入度为零的入队
            while (!queue.isEmpty()){
                Integer cur = queue.poll();
                res.add(cur);
                if(map.containsKey(cur) && map.get(cur).size() != 0){
                    for (Integer num : map.get(cur)) {
                        inDegree[num]--;
                        if(inDegree[num] == 0) queue.offer(num);
                    }
                }
            }
            //使用list的流来转为int[]数组,也可以通过遍历一遍完成转换。
            return res.size() == numCourses ? res.stream().mapToInt(Integer::valueOf).toArray() : new int[0];
        
        }
    }

     =====================7.27======================

    class Solution {
        public int[] findOrder(int numCourses, int[][] prerequisites) {
            if(numCourses==0) return new int[0];
            int[] inDegrees = new int[numCourses];
            for(int[] p:prerequisites){
                inDegrees[p[0]]++;
            }
            Queue<Integer> queue = new LinkedList<>();
            for(int i=0;i<inDegrees.length;i++){
                if(inDegrees[i]==0) queue.offer(i);
            }
    
            int count=0;
            int[] res = new int[numCourses];
            while(!queue.isEmpty()){
                int curr = queue.poll();
                res[count++]=curr;
                for(int[] p :prerequisites){
                    if(p[1]==curr){
                        inDegrees[p[0]]--;
                        if(inDegrees[p[0]]==0){
                            queue.offer(p[0]);
                        }
                    }
                }
            }
            if(count==numCourses)return res;
            return new int[0];
        }
    }

     

     

  • 相关阅读:
    005 Stream的创建
    006 虚拟主机
    002 nginx的进程模型
    001 胡说八道
    001 nginx的简介和安装
    004 docker配置国内镜像站
    012 SSH
    发放失败,此请求可能存在风险,已被微信拦截【未解决】
    项目使用Nuget,然后SVN checkout后显示缺少引用
    使用存储过程非常慢,但是直接执行SQL很快
  • 原文地址:https://www.cnblogs.com/doyi111/p/12913683.html
Copyright © 2011-2022 走看看