leetcode *207. 课程表(拓补排序)(2020.8.4)
【题目】*207. 课程表
本题和 210. 课程表 II 是几乎一样的题目。如果在过去完成过该题,那么只要将代码中的返回值从「非空数组 / 空数组」修改成「True / False」就可以通过本题。
输入: 2, [[1,0]]
输出: true
解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。
输入: 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)相关推荐
- LeetCode 207. 课程表(拓扑排序)
1. 题目 你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 . 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个 ...
- leetcode *210. 课程表 II(拓补排序)(2020.5.17)
[题目]*210. 课程表 II 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们 ...
- [力扣c语言实现]207. 课程表(拓扑排序)
207. 课程表(拓扑排序) 1. 题目描述 2.代码如下 1. 题目描述 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 . 在选修某些课程之前需要一些 ...
- 【BZOJ3036】绿豆蛙的归宿 拓补排序+概率
[BZOJ3036]绿豆蛙的归宿 Description 随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度. ...
- 奖金(拓补排序的应用)
谁应该高谁的入度++,并记录下谁比低的高(低的得出度),所以入度为零的就是最低的(好不公平),找出所有最低的,将他们算作一层,奖金++(算是拓补排序吧) #include<cstdio> ...
- HDU4324 - Triangle LOVE 拓补排序
HDU4324 - Triangle LOVE : http://acm.showproblemhdu.edu.cn/.php?pid=4324 标准的拓补排序,上代码 : #include < ...
- 51nod-生产口罩(拓补排序+DP)by zyz
题目:生产口罩 链接:http://class.51nod.com/Classes/Problem.html#courseProblemId=1718&classId=129 //注:题目来自 ...
- Aov网络与拓补排序的实现
测试的节点分布如下: 测试代码如下: /** 拓补排序的实现,使用邻接链表存储有向图 */ #include <iostream> #include <cstdio> #inc ...
- 每日一题30:拓补排序
问题描述 所谓拓补排序就是确定图中节点的一种顺序,使得某些在别的节点访问之前不能访问到的节点排在后面.所以该算法的核心是每一步选择一个没有入度的节点,因为没有入度意味着该节点没有前驱,得到一个节点后, ...
- 士兵排队问题(拓补排序)(附简要拓补排序思想及算法)
题目描述 有N个士兵(1<=N<=100),编号依次为1,2,...,N.队列训练时,指挥官要把士兵从高到矮排成一行,但指挥官只知道"1 比2 高,7 比 5高"这样的 ...
最新文章
- python如何启动app_Python手机app爬虫|Airtest连接多个手机的时候,如何启动APP-start_app...
- Lua mysql insert 并发数_高并发 Nginx+Lua OpenResty系列(6)——Lua开发库Mysql
- ps cs3怎样能保存html,ps cs3用消失点清理杂物方法介绍
- arraylist插入数据_集合系列 List(二):ArrayList
- windows多线程详解
- 【C++】n_element的用法
- MPush安装部署应用
- 51单片机制作计算机1602显示,51单片机对LCD1602液晶显示器的控制
- ArcGIS中将经纬度表格转为空间图层并制作采样点分布图
- Dracoo Master天龙卡牌大师
- 组织人事领域信息化探索:开启编制、干部、人事一体化管理新模式
- html5 canvas文字标签云3D旋转动画特效
- 阿里内网M8级别的“分布式到微服务”解密手册,你学废了嘛?
- 极路由设置虚拟服务器,HiWiFi极路由手机设置教程
- 中国互联网微博生死局及商业价值分析
- 线性规划(matlab篇)
- warmup_csaw_2016
- Jenkins2 流水线核心语法
- strcmp和strncmp函数
- 使用QQ邮箱“邮我”组件,方便他人快速给你发邮件