当前位置: 首页 > 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.jsqmd.com/news/310155/

相关文章:

  • 基于LSTM-ARIMA的空气质量预测与预警模型(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • hot100 124.二叉树中的最大路径和
  • 基于python的大气质量分析与预测项目(大数据分析数据可视化机器学习)(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • Python全球酒店预订数据分析课程(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 基于Python的网络数据分析可视化(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 未来3年,云端IDE市场格局将被DevBox类产品彻底颠覆
  • 十大门窗品牌哪家好?2026年真实测评排行榜与选购指南
  • mapCIDR使用手册
  • 吴恩达深度学习课程五:自然语言处理 第二周:词嵌入 课后习题与代码实践
  • 微信小程序监听返回操作,强制停留当前页面(右滑手势、安卓物理返回键)
  • JVM定义
  • 大语言模型实战(十七)——GraphRAG(图谱检索增强生成)介绍
  • Java毕设选题推荐:基于springboot的小区公共收益管理系统小区电梯广告、公共车位、场地租赁【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 计算机Java毕设实战-基于springboot的小区公共收益管理系统小区公共配套设施收益管理【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Java计算机毕设之基于springboot的小区公共收益归属、分配、管理、使用管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • 使用Qwen-agent构建智能体解决大模型数学计算问题
  • 使用VLLM+Deepseek+Milvus构建本地向量库
  • wqs二分
  • 【路径规划】基于快速扩展随机树RRT规划器实现机器人在在网格内找到从指定起始区域到目标区域的路径,同时避开沿途障碍物附matlab代码
  • 【图像增强】水下图像一致性增强评价系统Matlab实现
  • 【免费代码分享】10种卷积神经网络融合BiLSTM的多变量时间序列预测
  • 时序数据库 Apache IoTDB 入选国家重点研发计划高新技术成果产业化试点
  • 2026年回望:Sealos DevBox如何重新定义了云端开发的标准
  • Mac启动Redis并连接
  • 渲染慢到通宵,如何提高渲染速度? 这套技巧3 步搞定!
  • GPU 和 CPU 渲染谁更顶?新手必看的选型指南
  • 如何高效查询海量IP归属地?大数据分析中的IP查询应用
  • Github开源插件!最新豆包AI无水印图批量下载,免费无广告使用,支持高清无损图片下载 (1)
  • 私藏视频不想被看到?1招伪装教你一秒钟伪装
  • 《P2151 [SDOI2009] HH 去散步》