• [leetcode]207. Course Schedule课程表


    在一个有向图中,每次找到一个没有前驱节点的节点(也就是入度为0的节点),然后把它指向其他节点的边都去掉,重复这个过程(BFS),直到所有节点已被找到,或者没有符合条件的节点(如果图中有环存在)。

    /*
        思路就是平时学习的过程,每次都学习一个最先导课程(特征就是该课程没有先导课程),学完所有课程后就成功
        如果在某次遍历是发现所有课程都有先导课程,就失败退出。
        用一个数组记录每个课程都有几个先导课程,用多个hashset(BFS的数据记录结构)记录该课程的后续课程有哪些,
        每次学一个课程,就把该课程的后续课程的先导课程-1
         */
    
        public boolean canFinish(int numCourses, int[][] prerequisites){
            List<Set> list = new ArrayList<>();
            for (int i = 0; i < numCourses; i++) {
                list.add(new HashSet<Integer>());
            }
            //记录每个课程的后续课程
            for (int i = 0; i < prerequisites.length; i++) {
                list.get(prerequisites[i][1]).add(prerequisites[i][0]);
            }
            int[] pre = new int[numCourses];
            //记录每个课程的先导课程个数
            for (int i = 0; i < numCourses; i++) {
                Set set = list.get(i);
                Iterator<Integer> iter = set.iterator();
                while (iter.hasNext())
                    pre[iter.next()]++;
            }
            //下面开始BFS
            for (int i = 0; i < numCourses; i++) {
                int j = 0;
                //寻找最先导课程
                for (; j < numCourses; j++) {
                    if (pre[j]==0) break;
                }
                //无先导课程,有环
                if (j==numCourses) return false;
                //已经学习过的置-1
                pre[j]=-1;
    //            bfs过程,把后续课程的
                Set set = list.get(j);
                Iterator<Integer> iter = set.iterator();
                while (iter.hasNext())
                    pre[iter.next()]--;
            }
            return true;
        } 
  • 相关阅读:
    nginx文件类型错误解析漏洞
    js 获取URL中的参数并转换为对象
    postman
    php curl参数详解
    php 两变量值互换 方法
    PHP 命名空间与spl_autoload_register() 自动加载机制
    php命名大小问题
    PHP实现冒泡排序
    使用 PHPStorm + Xdebug 实现断点调试(二)
    TSPL学习笔记(2):过程和变量绑定
  • 原文地址:https://www.cnblogs.com/stAr-1/p/8465116.html
Copyright © 2020-2023  润新知