210. 课程表 II
Q:
现在你总共有 n 门课需要选,记为 0 到 n-1。
在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]
给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。
可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。
示例 1:
输入: 2, [[1,0]]
输出: [0,1]
解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1] 。
示例 2:
输入: 4, [[1,0],[2,0],[3,1],[3,2]]
输出: [0,1,2,3] or [0,2,1,3]
解释: 总共有 4 门课程。要学习课程 3,你应该先完成课程 1 和课程 2。并且课程 1 和课程 2 都应该排在课程 0 之后。
因此,一个正确的课程顺序是 [0,1,2,3] 。另一个正确的排序是 [0,2,1,3] 。
A:
DFS,这个要用逆邻接表,对当前节点要找它的所有前驱。
py:
class Solution:
def findOrder(self, numCourses: int, prerequisites):
temp=[[] for i in range(numCourses)]
visited=[0 for i in range(numCourses)]
res=[]
for x,y in prerequisites:
temp[x].append(y) #逆邻接表
def dfs(i):
if visited[i]==1:
return False
if visited[i]==-1:
return True
visited[i]=1
for pre_i in temp[i]:
if not dfs(pre_i):
return False
res.append(i)
visited[i]=-1
return True
for i in range(numCourses):
if not dfs(i):
return []
return res
cpp:
class Solution {
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites)
{
// if(prerequisites.size()==0 or prerequisites[0].size()==0)
// {
// return vector<int>();
// }
vector<vector<int>> reverse_matrix(numCourses,vector<int>()); //逆邻接矩阵
for(auto vec:prerequisites)
{
reverse_matrix[vec[0]].push_back(vec[1]); //matrix[i]包含的是i的前驱课程
}
vector<int> res,visited(numCourses,0);
for(int i=0;i<numCourses;++i)
{
if(not dfs(i,reverse_matrix,res,visited))
{
return vector<int>(); //只要有任何一次dfs返回false,就说明有环直接退出
}
}
return res;
}
bool dfs(int cur,vector<vector<int>>&matrix,vector<int>&res,vector<int>&visited)
{
if(visited[cur]==-1) //其他dfs中遍历到了,直接退出
{
return true;
}
if(visited[cur]==1) //本轮dfs中遍历到的节点又遍历到了,说明有环,无解
{
return false;
}
visited[cur]=1; //本次dfs递归中设为1,最后设为-1
for(auto pre_cur:matrix[cur]) //pre_cur为cur的前驱课程
{
if(not dfs(pre_cur,matrix,res,visited))
{
return false; //这里是最关键一步,dfs(cur)中先运行dfs(pre_cur),找所有前驱
}
}
//若上面for循环没返回false,说明已经将所有cur的前驱都加入了序列
res.push_back(cur); //这时候再加入cur,这样就满足了pre_cur(先修课程)先加入序列,(后继课程)cur后加入
visited[cur]=-1; //因为当前dfs要结束了,把cur的标志置-1,
//这样在之后另外的dfs中若遍历到当前cur节点,说明有环,作为查错使用
return true;
}
};
BFS,这个比较好想,就正常拓扑遍历过程中保存下每次的节点
class Solution:
def findOrder(self, numCourses: int, prerequisites):
from collections import deque
temp=[[] for i in range(numCourses)]
indegree=[0 for i in range(numCourses)]
for x,y in prerequisites:
temp[y].append(x)
indegree[x]+=1
queue=deque()
for i in range(numCourses):
if indegree[i]==0:
queue.append(i)
res=[]
while queue:
numCourses-=1
cur=queue.popleft()
res.append(cur)
for x in temp[cur]:
indegree[x]-=1
if indegree[x]==0:
queue.append(x)
return res if not numCourses else []
210. 课程表 II的更多相关文章
- Java实现 LeetCode 210 课程表 II(二)
210. 课程表 II 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0, ...
- [LeetCode] 210. 课程表 II
题目链接:https://leetcode-cn.com/problems/course-schedule-ii/ 题目描述: 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前 ...
- LeetCode:课程表II【210】
LeetCode:课程表II[210] 题目描述 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一 ...
- [leetcode]210. Course Schedule II课程表II
There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have prereq ...
- [Swift]LeetCode210. 课程表 II | Course Schedule II
There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have prereq ...
- 【LeetCode】课程表 II
[问题]现在你总共有 n 门课需要选,记为 0 到 n-1.在选修某些课程之前需要一些先修课程.例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及 ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- 精选 TOP 面试题
1 两数之和 46.5%简单2 两数相加 35.5%中等3 无重复字符的最长子串 31.1%中等4 寻找两个有序数组的中位数 35.9%困难5 最长回文子串 2 ...
- C#LeetCode刷题-拓扑排序
拓扑排序篇 # 题名 刷题 通过率 难度 207 课程表 40.0% 中等 210 课程表 II 39.8% 中等 329 矩阵中的最长递增路径 31.0% 困难
随机推荐
- HDU-1506 Largest Rectangle in a Histogram【单调栈】
Description A histogram is a polygon composed of a sequence of rectangles aligned at a common base l ...
- 在VMware下安装CentOS 7.6
转载自https://blog.51cto.com/hnyuanzijian/2343716?appinstall=0a.点击左上角文件,新建虚拟机,选择典型安装,并下一步 b.选择稍后安装操作系 ...
- centos 7 源码安装openresty
Openresty 官网 http://openresty.org Openresty源码下载页面 http://openresty.org/en/download.html Openresty 简易 ...
- vim编辑器-删除命令
dd:删除游标所在的一整行(常用) ndd:n为数字.删除光标所在的向下n行,例如20dd则是删除光标所在的向下20行 d1G:删除光标所在到第一行的所有数据 dG:删除光标所在到最后一行 ...
- VSCode的Vue插件Vetur设置
使用VSCode编写vue项目时安装了Vetur插件,但是每次alt+shift+f格式化代码的时候就有点让人头疼, 缩进自动变成了2个空格(习惯了用4个空格缩进,不同层级的代码看着明显一点),js代 ...
- Eclipse项目工程导入到IDEA继续开发-超详细
现在Java开发的主流工具是IDEA,不是说Eclipse,各有各的特色.不过我现在深深的爱上了idea这个工具. 但是之前很多项目都是用eclipse开发的,现在就转入到idea中进行继续开发. 1 ...
- 如何把U盘的两个盘或者多个盘合成一个
1.插入U盘,导出所有重要数据. 2.右击我的电脑,点管理打开设备管理器. 3.在设备管理器里找到磁盘管理. 4.在磁盘管理右侧出现下图: 5.如图是windows 7的界面. 6.找到U盘,图上是磁 ...
- V8 是怎么跑起来的 —— V8 中的对象表示
V8 是怎么跑起来的 —— V8 中的对象表示 ThornWu The best is yet to come 30 人赞同了该文章 本文创作于 2019-04-30,2019-12-20 迁移至此本 ...
- 10.3lambda表达式笔记
与参数不同被捕获的变量的值是在lambda创建时拷贝,而不是调用时拷贝 void fcn() { int v1 = 42; //局部变量 auto f = [v1] { return v1; }; a ...
- 题解 【洛谷P4995】跳跳!
一看题目名字,下意识地认为DP. 打开题目,发现是一道水的贪心,和DP没一分钱关系(毕竟是洛谷最水月赛的T2). 废话不多说. 看完题面,首先想到排序.要将乱序的石头高度变为有序,才能更好地想题. C ...