当前位置: 首页 > news >正文

hot100 207.课程表

思路:本题相当于给定一个有向图,判断图中是否存在环。

1.判断环:如果在递归的过程中,发现下一个节点在递归栈中(也就是正在访问中),则说明找到了环。

2.举例,如下图所示:路线1->2->3->4->2,走到4的时候,发现下一个节点2在递归栈中(正在访问中),访问到了访问过的节点,说明遇到环了。

3.注意:

(1)本题中,“正在访问中”的节点指的是正在递归处理的节点x及它的后续节点,因为此时dfs(x)尚未结束。

(2)不能只用两种状态表示节点“没有被访问过”和“被访问过”。举例,如上图所示,我们先dfs(0),再dfs(1),此时1的邻居0已经被访问过,但这并不能表示此时就找到了环。

List<int[]>和List<Integer>[]的区别:

(1)List<int[]>是一个单个的列表,列表中的每个元素是一个int[](整型数组),相当于一个数组的容器。

(2)List<Integer>[]是一个数组,数组的每个元素是一个List<Integer>(整数列表),就像是列表的数组。

g[x]存储数据示例:

// 初始化
g = [[], [], [], []]

// 处理 [1,0] → g[0].add(1)
g = [[1], [], [], []]

// 处理 [2,0] → g[0].add(2)
g = [[1, 2], [], [], []]

// 处理 [3,1] → g[1].add(3)
g = [[1, 2], [3], [], []]

// 处理 [3,2] → g[2].add(3)
g = [[1, 2], [3], [3], []]

最终g的含义:

g[0] = [1, 2] // 修完课程0后,可以修课程1或2
g[1] = [3] // 修完课程1后,可以修课程3
g[2] = [3] // 修完课程2后,可以修课程3
g[3] = [] // 课程3是终点,没有后续课程

5.复杂度分析:

(1)时间复杂度:O(n + m),其中n是numCourses,m是prerequisites的长度,每个节点至多递归访问一次,每条边至多遍历一次。

(2)空间复杂度:O(n + m),存储g需要O(n + m)的空间。

附代码:

class Solution { // true表示图中存在环,false表示图中不存在环 private boolean ans = false; public boolean canFinish(int numCourses, int[][] prerequisites) { // 构造图:数组 + 动态数组 List<Integer>[] g = new ArrayList[numCourses]; for (int i = 0;i < numCourses;i++){ g[i] = new ArrayList<>(); } for (int[] p : prerequisites){ g[p[1]].add(p[0]); } // 0:顶点尚未被访问到。 // 1:顶点正在访问中,dfs(x) 尚未结束。 // 2:顶点已经完全访问完毕。 int[] state = new int[numCourses]; // 对每个尚未访问的顶点进行 dfs for (int i = 0; i < numCourses; i++) { if (state[i] == 0) { dfs(i, g, state); } } // ans == true 表示图中存在环,即不能完成所有课程的学习,需要返回false,所以返回 !ans return !ans; } private void dfs(int x, List<Integer>[] g, int[] state) { // 2:当前顶点已经完全访问完毕。直接返回 if (state[x] == 2) { return; } // 1:当前顶点正在访问中,此时又再次访问到该节点,就表示存在环 if (state[x] == 1) { ans = true; return; } state[x] = 1; // 标记当前顶点正在访问中 for (int vertex : g[x]) { // 对于当前顶点的每一个邻居 dfs(vertex, g, state); } state[x] = 2; // 标记当前顶点访问完毕:1、该顶点没有邻居;2、该顶点的 dfs 递归返回了 } }
http://www.cnnetsun.cn/news/837416.html

相关文章:

  • C++引用:别名而已,为何如此关键?奥秘在哪里?
  • Python全球酒店预订数据分析课程(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 吐血推荐!专科生必用AI论文平台TOP10:开题报告神器大测评
  • 渲染慢到通宵,如何提高渲染速度? 这套技巧3 步搞定!
  • 【双指针】接雨水
  • 【鸿蒙PC命令行适配】xxHash 在鸿蒙 PC 上的适配移植实战与部署详解
  • 毕业救星!6款免费降ai率工具亲测,一键让论文AI率从80%降至5%
  • Java虚拟机类加载与类初始化解析
  • 大数据领域特征工程对数据分析的重要影响
  • Flutter for OpenHarmony:用三方 UI 库快速构建精美界面
  • 算法学习日记 | 枚举
  • 学霸同款9个AI论文平台,助你轻松搞定继续教育论文!
  • 聚划算!CNN-GRU、CNN、GRU三模型多特征分类预测对比Matlab实现
  • 【毕业设计】基于springboot的服装制造有限公司综合管理系统(源码+文档+远程调试,全bao定制等)
  • XML Schemas 简介
  • 基于机器学习LASSO回归逻辑回归算法对心脏衰竭病症预测分析完整代码+报告(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 什么是灰度发布(Gray Release)?
  • 西门子S7-1200控制5轴伺服程序加维纶触摸屏画面案例。 1.PTO伺服轴脉冲定位控制功能应...
  • 浙大突破:经验学习提升AI智能体现实世界物理认知
  • 中山大学等九校联手突破:AI实现软件bug自动侦测与修复
  • 计算机Java毕设实战-基于AI功能+大数据可视化分析+Spark的买菜推荐系统设计与实现基于spark的买菜推荐系统设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Linux嵌入式视频流加速接入V4L2:突破多路摄像头的帧率瓶颈
  • 从理论到代码:实现AI原生应用中的知识抽取
  • 【课程设计/毕业设计】基于大数据Spark的买菜推荐系统设计与实现基于spark的买菜推荐系统设计与实现【附源码、数据库、万字文档】
  • 大数据领域Hive的索引机制与性能提升
  • 免费降AI工具有用吗?实测5款告诉你哪个真能用
  • springboot家教平台网站vue
  • ADC--模数转换器
  • Java计算机毕设之基于springboot的城市轨道交通安全管理系统基于SpringBoot的都市轨道交通综合服务平台(完整前后端代码+说明文档+LW,调试定制等)
  • SCI投稿前必备:5款英文论文降AI工具横评推荐