【题目】*207. 课程表

本题和 210. 课程表 II 是几乎一样的题目。如果在过去完成过该题,那么只要将代码中的返回值从「非空数组 / 空数组」修改成「True / False」就可以通过本题。

你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。
在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]
给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?

示例 1:

输入: 2, [[1,0]]
输出: true
解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。

示例 2:

输入: 2, [[1,0],[0,1]]
输出: false
解释: 总共有 2 门课程。学习课程 1 之前,你需要先完成​课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。

提示:
输入的先决条件是由 边缘列表 表示的图形,而不是 邻接矩阵 。详情请参见图的表示法。
你可以假定输入的先决条件中没有重复的边。
1 <= numCourses <= 10^5

【解题思路1】DFS - 邻接链表

class Solution {private int k = 0;public boolean canFinish(int numCourses, int[][] prerequisites) {int[] input = new int[numCourses];int[] ans = new int[numCourses];List[] edges = new ArrayList[numCourses]; //邻接链表for(int i = 0; i < numCourses; i++){edges[i] = new ArrayList<Integer>();}for(int[] pre : prerequisites){input[pre[0]]++; //统计结点入度edges[pre[1]].add(pre[0]); //当前节点指向的结点建立ArrayList,如[3,1][3,2],3对应的就是[1,2]}//将入度为0的结点加入结果,并对此结点递归(拓补排序)for(int i = 0; i < numCourses; i++){if(input[i] == 0){ans[k++] = i;input[i]--;topologicalSorting(edges, edges[i], input, ans);}}//若有结点未加入结果,则说明存在环return k == numCourses ? true : false;}public void topologicalSorting(List[] edges, List<Integer> list, int[] input, int[] ans){for(int course : list){input[course]--;if(input[course] == 0){ans[k++] = course;input[course]--;topologicalSorting(edges, edges[course], input, ans);}}}
}

【解题思路2】BFS - 队列

class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {int[] input = new int[numCourses];int[] res = new int[numCourses];Queue<Integer> queue = new LinkedList<>();for(int[] edge : prerequisites){input[edge[0]]++; //计算结点的入度}for(int i = 0; i < numCourses; i++){if(input[i] == 0){queue.offer(i); //入度为0的点入队}}int idx = 0;while(!queue.isEmpty()){int temp = queue.poll(); //出队并加入结果res[idx++] = temp;for(int[] edge : prerequisites){if(edge[1] == temp){ //当前点指向的点入度--,如果--后其入度为0,入队input[edge[0]]--;if(input[edge[0]] == 0){queue.offer(edge[0]);}}}}//出现环(res中没有包括所有的点)return idx == numCourses ? true : false;}
}

leetcode *207. 课程表(拓补排序)(2020.8.4)相关推荐

  1. LeetCode 207. 课程表(拓扑排序)

    1. 题目 你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 . 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个 ...

  2. leetcode *210. 课程表 II(拓补排序)(2020.5.17)

    [题目]*210. 课程表 II 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们 ...

  3. [力扣c语言实现]207. 课程表(拓扑排序)

    207. 课程表(拓扑排序) 1. 题目描述 2.代码如下 1. 题目描述 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 . 在选修某些课程之前需要一些 ...

  4. 【BZOJ3036】绿豆蛙的归宿 拓补排序+概率

    [BZOJ3036]绿豆蛙的归宿 Description 随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度. ...

  5. 奖金(拓补排序的应用)

    谁应该高谁的入度++,并记录下谁比低的高(低的得出度),所以入度为零的就是最低的(好不公平),找出所有最低的,将他们算作一层,奖金++(算是拓补排序吧) #include<cstdio> ...

  6. HDU4324 - Triangle LOVE 拓补排序

    HDU4324 - Triangle LOVE : http://acm.showproblemhdu.edu.cn/.php?pid=4324 标准的拓补排序,上代码 : #include < ...

  7. 51nod-生产口罩(拓补排序+DP)by zyz

    题目:生产口罩 链接:http://class.51nod.com/Classes/Problem.html#courseProblemId=1718&classId=129 //注:题目来自 ...

  8. Aov网络与拓补排序的实现

    测试的节点分布如下: 测试代码如下: /** 拓补排序的实现,使用邻接链表存储有向图 */ #include <iostream> #include <cstdio> #inc ...

  9. 每日一题30:拓补排序

    问题描述 所谓拓补排序就是确定图中节点的一种顺序,使得某些在别的节点访问之前不能访问到的节点排在后面.所以该算法的核心是每一步选择一个没有入度的节点,因为没有入度意味着该节点没有前驱,得到一个节点后, ...

  10. 士兵排队问题(拓补排序)(附简要拓补排序思想及算法)

    题目描述 有N个士兵(1<=N<=100),编号依次为1,2,...,N.队列训练时,指挥官要把士兵从高到矮排成一行,但指挥官只知道"1 比2 高,7 比 5高"这样的 ...

最新文章

  1. python如何启动app_Python手机app爬虫|Airtest连接多个手机的时候,如何启动APP-start_app...
  2. Lua mysql insert 并发数_高并发 Nginx+Lua OpenResty系列(6)——Lua开发库Mysql
  3. ps cs3怎样能保存html,ps cs3用消失点清理杂物方法介绍
  4. arraylist插入数据_集合系列 List(二):ArrayList
  5. windows多线程详解
  6. 【C++】n_element的用法
  7. MPush安装部署应用
  8. 51单片机制作计算机1602显示,51单片机对LCD1602液晶显示器的控制
  9. ArcGIS中将经纬度表格转为空间图层并制作采样点分布图
  10. Dracoo Master天龙卡牌大师
  11. 组织人事领域信息化探索:开启编制、干部、人事一体化管理新模式
  12. html5 canvas文字标签云3D旋转动画特效
  13. 阿里内网M8级别的“分布式到微服务”解密手册,你学废了嘛?
  14. 极路由设置虚拟服务器,HiWiFi极路由手机设置教程
  15. 中国互联网微博生死局及商业价值分析
  16. 线性规划(matlab篇)
  17. warmup_csaw_2016
  18. Jenkins2 流水线核心语法
  19. strcmp和strncmp函数
  20. 使用QQ邮箱“邮我”组件,方便他人快速给你发邮件

热门文章

  1. ubuntu系统下快速安装谷歌浏览器(图文教程)
  2. PPT背景填充的几种方式,简单高效
  3. 微信公众号网页开发逻辑梳理
  4. matlab矩形频谱图,如何用matlab画出周期矩形脉冲信号及频谱图?
  5. 为什么显示连接服务器超时,连接服务器超时什么意思
  6. Numpy的终极备忘录
  7. 使用Python修改图片格式
  8. Jdk8 中文 api(百度网盘免费下载)
  9. setValue和setObject的区别
  10. ElementUI表单构建