news 2026/4/15 13:33:59

hot100 207.课程表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 递归返回了 } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 5:31:14

面试-RMSNorm和LayerNorm的区别

1 LayerNorm 背景: 在神经网络中,每一层输出都将作为下一层的输入。 问题: 在训练过程中,前一层参数的微小更新,所带来的输出会导致后一层输入的分布发生剧烈变化。这就是层与层之间的动态失调。俗称 内部协变量偏移(Internal Covariate Shift)。 现象: 比如,第一层…

作者头像 李华
网站建设 2026/4/8 20:22:51

GPU 和 CPU 渲染谁更顶?新手必看的选型指南

在3D渲染、影视后期、游戏开发领域&#xff0c;“GPU与CPU渲染选哪个”是高频争议题。新手纠结硬件选型&#xff0c;老手权衡效率与质量&#xff0c;实则二者无绝对优劣&#xff0c;核心是适配场景——如同搬东西&#xff0c;CPU像法拉利&#xff08;快但装载量小&#xff09;&…

作者头像 李华
网站建设 2026/3/27 17:41:19

【六杆】六杆快速回归机制运动学和动力学分析附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#…

作者头像 李华
网站建设 2026/3/27 11:58:36

java: 找不到符号方法 getCode()

运行Spring Boot工程代码出现以下报错&#xff1a; 位置: 类型为com.xx.xx.exception.ErrorCode的变量 errorCode解决方法看截图中间那个路径框&#xff1a; ...lombok\unknown\lombok-unknown.jar这里的 unknown 说明 IDEA 根本没找到 Lombok 的 jar 包。 接下来&#xff0c; …

作者头像 李华
网站建设 2026/3/26 18:46:18

【双指针】盛水最多的容器

求解代码 public int maxArea(int[] height) {int left 0; // 左指针int right height.length - 1; // 右指针int ans 0; // 记录最大面积&#xff0c;初始为0&#xff08;面积非负&#xff09;// 双指针相向遍历&#xff0c;直到指针相遇while (left < right) {// 计算当…

作者头像 李华