【问题描述】[中等]

【解答思路】

1. 拓扑排序

复杂度分析

HashSet[] 数组

import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;public class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {if (numCourses <= 0) {return false;}// 特判int pLen = prerequisites.length;if (pLen == 0) {return true;}int[] inDegree = new int[numCourses];HashSet<Integer>[] adj = new HashSet[numCourses];for (int i = 0; i < numCourses; i++) {adj[i] = new HashSet<>();}for (int[] p : prerequisites) {inDegree[p[0]]++;adj[p[1]].add(p[0]);}Queue<Integer> queue = new LinkedList<>();// 首先加入入度为 0 的结点for (int i = 0; i < numCourses; i++) {if (inDegree[i] == 0) {queue.add(i);}}// 记录已经出队的课程数量int cnt = 0;while (!queue.isEmpty()) {Integer top = queue.poll();cnt += 1;// 遍历当前出队结点的所有后继结点for (int successor : adj[top]) {inDegree[successor]--;if (inDegree[successor] == 0) {queue.add(successor);}}}return cnt == numCourses;}
}

List<List>

class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {int[] indegrees = new int[numCourses];List<List<Integer>> adjacency = new ArrayList<>();Queue<Integer> queue = new LinkedList<>();for(int i = 0; i < numCourses; i++)adjacency.add(new ArrayList<>());// Get the indegree and adjacency of every course.for(int[] cp : prerequisites) {indegrees[cp[0]]++;adjacency.get(cp[1]).add(cp[0]);}// Get all the courses with the indegree of 0.for(int i = 0; i < numCourses; i++)if(indegrees[i] == 0) queue.add(i);// BFS TopSort.while(!queue.isEmpty()) {int pre = queue.poll();numCourses--;for(int cur : adjacency.get(pre))if(--indegrees[cur] == 0) queue.add(cur);}return numCourses == 0;}
}
2. DFS


复杂度

class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {List<List<Integer>> adjacency = new ArrayList<>();for(int i = 0; i < numCourses; i++)adjacency.add(new ArrayList<>());int[] flags = new int[numCourses];for(int[] cp : prerequisites)adjacency.get(cp[1]).add(cp[0]);for(int i = 0; i < numCourses; i++)if(!dfs(adjacency, flags, i)) return false;return true;}private boolean dfs(List<List<Integer>> adjacency, int[] flags, int i) {if(flags[i] == 1) return false;if(flags[i] == -1) return true;flags[i] = 1;for(Integer j : adjacency.get(i))if(!dfs(adjacency, flags, j)) return false;flags[i] = -1;return true;}
}

【总结】

1. 拓扑排序

拓扑排序实际上应用的是贪心算法。贪心算法简而言之:每一步最优,全局就最优。

具体到拓扑排序,每一次都从图中删除没有前驱的顶点,这里并不需要真正的做删除操作,我们可以设置一个入度数组,每一轮都输出入度为 00 的结点,并移除它、修改它指向的结点的入度(-1−1即可),依次得到的结点序列就是拓扑排序的结点序列。如果图中还有结点没有被移除,则说明“不能完成所有课程的学习”。

拓扑排序保证了每个活动(在这题中是“课程”)的所有前驱活动都排在该活动的前面,并且可以完成所有活动。拓扑排序的结果不唯一。拓扑排序还可以用于检测一个有向图是否有环。相关的概念还有 AOV 网,这里就不展开了。




2.拓扑排序

1.统计箭头指向的度
2.度为0的入队
3.统计层数 出队 相关度减一且度为0入队
4.队为空作判断

3.相关题目[Leedcode][JAVA][第210 题][课程表 II][拓扑排序][BFS][DFS][有向图]

转载链接:https://leetcode-cn.com/problems/course-schedule/solution/tuo-bu-pai-xu-by-liweiwei1419/
作者:Krahets
转载链接:https://leetcode-cn.com/problems/course-schedule/solution/course-schedule-tuo-bu-pai-xu-bfsdfsliang-chong-fa/

[Leetcode][第207题][JAVA][课程表][拓扑排序][DFS]相关推荐

  1. [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]

    [问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...

  2. LeetCode 1273. 删除树节点(拓扑排序/DFS)

    文章目录 1. 题目 2. 解题 2.1 取巧解 2.2 拓扑排序 2.3 建图+DFS 1. 题目 给你一棵以节点 0 为根节点的树,定义如下: 节点的总数为 nodes 个: 第 i 个节点的值为 ...

  3. [Leetcode][第404题][JAVA][左叶子之和][DFS][BFS]

    [问题描述][简单] [解答思路] 1. DFS 递进思想 一步一步递进 /先序遍历求所有节点值之和 public int sumOfTrees(TreeNode root) {if (root == ...

  4. [Leetcode][第841题][JAVA][钥匙和房间][DFS][BFS]

    [问题描述][中等] [解答思路] 当 xx 号房间中有 yy 号房间的钥匙时,我们就可以从 xx 号房间去往 yy 号房间.如果我们将这 nn 个房间看成有向图中的 nn 个节点,那么上述关系就可以 ...

  5. [Leetcode][第733题][JAVA][图像渲染][BFS][DFS]

    [问题描述][简单] [解答思路] 千万不要想复杂了 不是三维空间 是一维空间 ! 本题要求将给定的二维数组中指定的「色块」染成另一种颜色.「色块」的定义是:直接或间接相邻的同色方格构成的整体. 可以 ...

  6. [Leetcode][第785题][JAVA][判断二分图][BFS][DFS]

    [问题描述][中等] [解答思路] 1. DFS 深度优先遍历 时间复杂度:O(N+M) 空间复杂度:O(N) class Solution {private static final int UNC ...

  7. [Leetcode][第78题][JAVA][子集][位运算][回溯]

    [问题描述][中等] [解答思路] 1. 位运算 复杂度 class Solution {List<Integer> t = new ArrayList<Integer>(); ...

  8. [Leetcode][第79题][JAVA][单词搜索][DFS][回溯]

    [问题描述][中等] [解答思路] 1. DFS繁琐版本 class Solution {public boolean exist(char[][] board, String word) {bool ...

  9. [Leetcode][第40题][JAVA][数组总和2][回溯][剪枝]

    [问题描述][中等] [解答思路] 1. 减法 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Ar ...

最新文章

  1. Laravel和Thinkphp有什么区别,哪个框架好用
  2. Java 8中一些常用的全新的函数式接口
  3. 五分钟了解Mysql的行级锁——《深究Mysql锁》
  4. 快速恢复Word、Excel的默认初始设置
  5. 详解S60 WebKit 21772编译教程
  6. 安卓学习笔记17:常用控件 - 编辑框
  7. CListCtrl 使用方法总结
  8. windows--reg--向注册表中写入一些数据
  9. 只要32万8,国产特斯拉带回家,官方:月供低至1100
  10. Spark之键值RDD转换(转载)
  11. Android修改读写速度,Android 通过adb测试机器读写速度(rk)
  12. CDN、SCDN、DCDN是什
  13. ANSYS 15 直接优化分析
  14. 摄影网站主页源码html,2017年最新15个漂亮的 HTML 摄影网站模板
  15. InstallShield脚本使用笔记
  16. 剧中人的2018年终总结
  17. 虚拟机配置及系统加固
  18. mysql读取股票数据_读取股票数据存储到本地MySQL数据库(一)
  19. CTC:围观大佬从语音/文字客观存在的 blank 发力,玩转前缀 + 动态规划,打造无缝衔接神经网络的不定长序列识别
  20. C++jump game跳跃游戏的算法(附完整源码)

热门文章

  1. 同意按钮,倒计时10秒,同意按钮变为可提交的
  2. CAF(C++ actor framework)(序列化之结构体,任意嵌套STL)(一)
  3. ASP.NET MVC5+EF6+EasyUI 后台管理系统(51)-系统升级
  4. 如何运行ruby代码
  5. InnoDB的auto_increment指定值被重置问题
  6. 使用Remoting技术
  7. java二分法查找法算法_算法二:二分法查找(java语言)
  8. c语言标准库 swap,swap
  9. 三阶矩阵的lu分解详细步骤_快速入门矩阵运算——开源库Eigen
  10. 金士顿 8G u盘 红色 量产记录