输入:课程数量n,每个课程的编号是0到n-1。课程学习的先后顺序用数组输入,例如[0,1]。要学习课程0,需要先学习课程1。
输出:如果可以学习完所有的课程,返回true,否则返回false。
分析:因为有些课程学习需要其他课程学习完才可以,这是拓扑排序的描述。我们可以根据数组对,建立一个有向图。方向是从前提课程指向能够到达的课程。需要从没有先决条件的课程i开始,接着课程i能到达的课程j入度减1。如果课程j的入度为0 ,那继续加入可学习队列。如此及不断向外扩大学习范围。可以用BFS或者DFS实现。

DFS实现:

public boolean canFinishV3(int numCourses, int[][] prerequisites) {int[] inDegree = new int[numCourses];boolean[] visited = new boolean[numCourses];List<List<Integer>> graph = new ArrayList<List<Integer>>(numCourses);for(int i=0;i<numCourses;i++){graph.add(new ArrayList<Integer>());}for(int i=0;i<prerequisites.length;i++){inDegree[prerequisites[i][0]]++;graph.get(prerequisites[i][1]).add(prerequisites[i][0]);}for(int i=0;i<numCourses;i++){if(visited[i]==false && inDegree[i]==0){if(!bfs(graph,visited,inDegree,i)){return false;}}}for(int i=0;i<numCourses;i++){if(visited[i]==false) return false;}return true;}private boolean bfs(List<List<Integer>> graph,boolean[] visited,int[] inDegree,int index){if(visited[index]) return false;visited[index] = true;for(Integer toCourse : graph.get(index)){inDegree[toCourse]--;if(inDegree[toCourse]==0){if(!bfs(graph,visited,inDegree,toCourse)){return false;}}}return true;}

BFS实现

public boolean canFinishV2(int numCourses, int[][] prerequisites) {int[] inDegree = new int[numCourses];List<List<Integer>> graph = new ArrayList<List<Integer>>(numCourses);for (int i = 0; i < numCourses; i++) {graph.add(new ArrayList<Integer>());}for (int i = 0; i < prerequisites.length; i++) {inDegree[prerequisites[i][0]]++;graph.get(prerequisites[i][1]).add(prerequisites[i][0]);}Queue<Integer> queue = new LinkedList<Integer>();for (int i = 0; i < numCourses; i++) {if (inDegree[i] == 0) {queue.add(i);}}int count = 0;while (!queue.isEmpty()) {int course = queue.poll();count++;for (Integer toCourse : graph.get(course)) {inDegree[toCourse]--;if (inDegree[toCourse] == 0) {queue.add(toCourse);}}}return count == numCourses;}

这道题目与210的区别是210要求输入学习路线。
207代码
210代码

207. Course Schedule相关推荐

  1. 207. Course Schedule 210. Course Schedule II

    拓扑排序的问题 套路: 1. 初始化所有的节点的入度为零. 2. 遍历给定的输入要求. 维护一个indegree 的表.记录每个节点的入度. 维护map, 每个节点的后续节点 3. 得到这两个表以后开 ...

  2. 207. Course Schedule 课程表

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

  3. leetcode 207. Course Schedule | 207. 课程表(Java)

    题目 https://leetcode.com/problems/course-schedule/ 题解 这的道题思路,来源于数据结构中的 拓扑排序 问题,主要思路是,通过逐步遍历删除入度为 0 的节 ...

  4. [leetcode]207. Course Schedule课程表

    在一个有向图中,每次找到一个没有前驱节点的节点(也就是入度为0的节点),然后把它指向其他节点的边都去掉,重复这个过程(BFS),直到所有节点已被找到,或者没有符合条件的节点(如果图中有环存在). /* ...

  5. leetcode 210. Course Schedule II | 210. 课程表 II(Java)

    题目 https://leetcode.com/problems/course-schedule-ii/ 题解 本题与 leetcode 207. Course Schedule 基本相同,代码只需要 ...

  6. 继续过中等难度.0309

      .   8  String to Integer (atoi)    13.9% Medium   . 151 Reverse Words in a String      15.7% Mediu ...

  7. LeetCode 399. Evaluate Division--Python-DFS解法

    题目地址:Evaluate Division - LeetCode Equations are given in the format A / B = k, where A and B are var ...

  8. LeetCode 所有题目总结

    文章目录 做题注意事项 题目分类 1.位运算 2.字符串题型 3.TopK 问题--最大堆/最小堆 4.链表 5.动态规划 easy Medium hard 6.贪心 7.树 8.图 9.数学题 10 ...

  9. Depth-first Search深度优先搜索专题4

    576. Out of Boundary Paths 思路:这道题目难倒了我.最直接的思路是暴力搜索.要注意的问题1是需要仔细观察Example2,轨迹不同意思是可以从A点到B点,再从B点到A点也可以 ...

最新文章

  1. 日期控件的点击事件,在js中添加callback属性,不在html中直接添加
  2. Kafka系列2-producer和consumer报错
  3. “QMYSQL: Unable to allocate a MYSQL object“ 解决方法
  4. java 日志使用_Java日志正确使用姿势
  5. php中Session的生成机制、回收机制和存储机制探究
  6. Struts2基础知识
  7. jpadao层继承什么_实木复合地板特点是什么
  8. 单例模式(学习小记)
  9. 替换Tomcat在浏览器地址栏中的ico图标
  10. telnet 命令参数及其应用方式
  11. 2022-2027年中国新能源车电控电机市场竞争态势及行业投资前景预测报告
  12. Unity3D场景制作基本操作
  13. 请冷静地对待手中的EOS——EOS数据分析
  14. java泛型笔记2--上界通配符
  15. 大球分析系统_走地大球分析系统app
  16. 【C++】%c,%s分别代表什么意思
  17. 信源编码技术作业(1)绘制、分析清浊音频谱图
  18. 安兔兔电脑ssd测试软件,安兔兔SSD测试软件测评,威钰战国NVMe SSD
  19. 微软Windows 11正式发布!(文末送书)
  20. 成功与失败——《异类》读后感

热门文章

  1. 每次新建Android项目都报样式找不到的错误?
  2. 排错“未能封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配”...
  3. 【Codeforces #130 Div2】Solutions
  4. 父亲的忠告:把孩子培养成普通人
  5. C# 的Delegate(委托)
  6. android 加载显示富文本——TextView显示富文本和WebView显示富文本,WebView显示图片适配屏幕宽度
  7. vue router 常用操作 重定向 redirect
  8. js 判断 浏览器 是否为 微信 浏览器
  9. 宝塔面板 mongodb 允许外网访问
  10. linux的yum详解,Linux之YUM 详解