解题思路:

与第207题很像,多的是需要存储一个修读课程的可行解,所以在dfs函数内,当判断第i门课程不存在环时,需要将其push_back进数组cur中。

由于是用深度优先搜索的方法,所以存储在cur数组中的顺序是反过来的,因为graph中第 i 行存储的是修读课程 i 所需的课程。

在测试案例中,会有空的prerequisites数组,所以需要在findOrder函数中遍历一次所有课程,保证cur数组的size等于课程数量。

class Solution {
public:vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {//先建立graphvector<vector<int> > g(numCourses, vector<int>());for(auto a: prerequisites){g[a[1]].push_back(a[0]);}vector<int> visit(numCourses);vector<int> cur;for(int i = 0; i < numCourses; i++){if(!dfs(g, visit, cur, i)){return {};}}reverse(cur.begin(), cur.end());return cur;}bool dfs(vector<vector<int> >& g, vector<int>& visit, vector<int>& cur, int i){// if(cur.size() == g.size()) return true;if(visit[i] == -1) return false;if(visit[i] == 1) return true;visit[i] = -1;for(auto a: g[i]){if(!dfs(g, visit, cur, a)) return false;}//第i门课程的修读不存在环,将其push_back到数组cur中cur.push_back(i);visit[i] = 1;return true;}
};

Leetcode 210. 课程表 II 解题思路及C++实现相关推荐

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

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

  2. LeetCode—210. 课程表 II

    210. 课程表 II 题目描述:现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1.给你一个数组 prerequisites ,其中 prerequisite ...

  3. LeetCode 210. 课程表 II(拓扑排序)

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

  4. Leetcode 90. 子集 II 解题思路及C++实现

    解题思路: 经典的深度优先搜索问题. 这里,根据子集的元素个数 i ,分别进行 dfs .因为 nums 数组中有重复元素,所以在 dfs 程序中,需要有一个去重的判断. 判断逻辑为:当前元素与上一个 ...

  5. Leetcode 210.课程表II

    Time: 20190903 Type: Medium 考察:拓扑排序 题目描述 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 , ...

  6. LeetCode 210. 课程表 II(Kahn)

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

  7. 210. 课程表 II kahn求拓扑图算法

    210. 课程表 II 难度:中等 题目描述 解题思路 以前没有写过图的,但是有了解过拓扑排序,根据提示还有算法描述很容易就写出代码了.用栈和队列都行,如果用栈就是深度优先搜索,用队列就是广度优先搜索 ...

  8. 207.课程表 | 210.课程表II(拓扑排序)

    207.课程表 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 . 在选修某些课程之前需要一些先修课程. 先修课程按数组 prerequisites 给出 ...

  9. LeetCode 中等难度 92. 反转链表 II解题思路

    92. 反转链表 II 题目:中等难度 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4-& ...

最新文章

  1. 佳能ts3100打印机使用说明书_佳能TS9120打印机完全满足家庭使用—最具性价比打印机...
  2. Win7 下面 用easybcd 引导 安装 ubuntu 14.04
  3. Cordova打包教程知识体系整理(Vue项目打包成ipa)
  4. python函数调用位置_Python: 浅谈函数局部变量快在哪
  5. 数据结构与算法之希尔排序
  6. linux文件编程(3)—— main函数传参、myCp(配置成环境变量)、修改配置文件、整数和结构体数组写到文件
  7. 用java写四则混合运算,JAVA写的四则混合运算-JSP教程,Java技巧及代码
  8. 开发html,HTML开发基础
  9. 循环体中对集合进行增删时报错:java.util.ConcurrentModificationException
  10. php168批量添加会员,ecshop快速批量添加会员
  11. 威纶通定时循环操作宏_「精品详解」威纶通触摸屏宏指令应用(三)
  12. java 时间 转化成数字_将时间转化为数字 java
  13. App开发 - 谈谈App架构的演进
  14. 10秒钟搞定圆柱齿轮设计所有课题
  15. 阴阳师ios和android,《阴阳师》App Store表现优异,安卓苹果惊喜同服
  16. 房屋装修设计更显档次需要从几个方面入手
  17. 如何彻底卸载2345全家桶?
  18. GPS的一些浅显知识兼介绍一下GPS测试仪
  19. linux diff使用方法,Linux diff 使用教程
  20. Sqlserver官网下载时各版本含义

热门文章

  1. c语言中int*point 其中point是指针变量名,2012年计算机等级二级C语言章节习题及答案(9)...
  2. fork+exit+php,php实现简单的守护进程创建、开启与关闭操作
  3. inotify+rsync实时同步服务部署
  4. [BZOJ4994] [Usaco2017 Feb]Why Did the Cow Cross the Road III(树状数组)
  5. 移动机器人路径规划---深蓝学院培训学习记录
  6. Android启动过程以及各个镜像的关系
  7. Cloudera Manager(CDH5)内部结构、功能包括配置文件、目录位置等
  8. 学习scala的网站汇总
  9. TextView使用实例
  10. Docker学习与和应用(二)_使用Docker