在一个有向图中,每次找到一个没有前驱节点的节点(也就是入度为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;
}

[leetcode]207. Course Schedule课程表的更多相关文章

  1. [LeetCode] 207. Course Schedule 课程表

    题目: 分析: 这是一道典型的拓扑排序问题.那么何为拓扑排序? 拓扑排序: 有三件事情A,B,C要完成,A随时可以完成,但B和C只有A完成之后才可完成,那么拓扑排序可以为A>B>C或A&g ...

  2. LeetCode - 207. Course Schedule

    207. Course Schedule Problem's Link ---------------------------------------------------------------- ...

  3. Java for LeetCode 207 Course Schedule【Medium】

    There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...

  4. LN : leetcode 207 Course Schedule

    lc 207 Course Schedule 207 Course Schedule There are a total of n courses you have to take, labeled ...

  5. [LeetCode] 207. Course Schedule 课程安排

    There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...

  6. [LeetCode] 207. Course Schedule 课程清单

    There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have prereq ...

  7. (medium)LeetCode 207.Course Schedule

    There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...

  8. LeetCode 207. Course Schedule(拓扑排序)

    题目 There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have p ...

  9. Java for LeetCode 210 Course Schedule II

    There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...

随机推荐

  1. 20200520_windows2012安装python和django环境

    http://httpd.apache.org/download.cgi#apache24 配置文件修改后, 记得去阿里云开放端口 ServerName 172.18.196.189:9080 →不能 ...

  2. 微软发布 Pylance:改善 VS Code 中的 Python 体验

    原标题:微软发布 Pylance:改善 VS Code 中的 Python 体验 来源:开源中国 微软宣布推出一种新的 Python 语言服务器,名为 Pylance,其可利用语言服务器协议与 VS ...

  3. npm常用操作

    Npm常用操作 1. 淘宝镜像 1.1 npm临时使用淘宝镜像安装依赖包 npm i -g express --registry https://registry.npm.taobao.org 1.2 ...

  4. 第4.3节 Python中与迭代相关的函数

    下面要介绍的enumerate.range.zip.reversed.sorted属于Python内置的函数或者类别,返回的对象都可通过迭代方法访问. 一.    enumerate函数 1.     ...

  5. PyQt学习随笔:ListView控件增加列表项

    ListView控件如果需要增加列表项,就是在对应数据存储中插入项,这又分两种情况,一种是已知列表数据存储,一种是未知数据存储.如果是未知数据存储,可以通过: ListView控件名.model() ...

  6. PyQt(Python+Qt)学习随笔:Qt Designer中主窗口对象的toolButtonStyle属性

    tooButtonStyle属性保存主窗口工具栏按钮的样式设置,用来表示工具栏按钮的文字和图标怎么显示. 该属性的可设置值类型为枚举类型Qt.ToolButtonStyle,它包含如下值: 该属性的缺 ...

  7. Java基础学习之基础概念与环境搭建(1)

    1.Java基础概念 1.1.Java语言的特点 Java语言是简单易学的 Java语言是面向对象(封装.继承和多态) Java语言是平台无关的(一次编译,到处运行) Java语言是可靠的.安全的(异 ...

  8. Autofac 动态获取对象静态类获取对象

    Autofac 从容器中获取对象 静态类或Service场景可以动态,可以直接动态获取对象 /// <summary> /// 从容器中获取对象 /// </summary> ...

  9. 【JVM】类加载器与双亲委派

    类加载器,顾名思义,即是实现类加载的功能模块,负责将Class的字节码形式加载成内存形式的Class对象.字节码文件可来源于磁盘或者jar包中的Class文件,也可以来自网络字节流. 类加载器 在JV ...

  10. CSP-S 2020 游记

    2020.10.11 初赛了,没怎么做题,之前在网上两次初赛模拟赛 95pts / 94pts,还白嫖了一本书,感觉挺好. 去考场,中途不舒服去了厕所,回来发现有点来不及,阅读程序最后两题不会瞎蒙. ...