news 2026/4/17 2:29:56

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/16 14:43:06

电子元器件高低温形变精准检测方案

前言&#xff1a;在实际应用中&#xff0c;电子元器件会面临较大的温差变化环境。通过温度循环试验&#xff0c;使元器件在短时间内反复承受高低温变化的影响&#xff0c;进而暴露出因材料热胀冷缩性能不匹配、内引线与管芯涂料温度系数不匹配、芯片裂纹、接触不良或制造工艺问…

作者头像 李华
网站建设 2026/4/10 3:18:10

Java毕设选题推荐:基于springboot的校园生活互动平台大学生社交平台【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

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

基于Springboot流浪动物救助平台【附源码+文档】

&#x1f495;&#x1f495;作者&#xff1a; 米罗学长 &#x1f495;&#x1f495;个人简介&#xff1a;混迹java圈十余年&#xff0c;精通Java、小程序、数据库等。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xff0c;springboot等项目&#…

作者头像 李华
网站建设 2026/4/16 7:48:48

1月新专利下证!亚马逊爆款品类侵权预警

2026年1月美国专利商标局&#xff08;USPTO&#xff09;新增一批外观专利授权&#xff0c;赛贝挑选了部分亚马逊热销品类&#xff0c;覆盖宠物用品、家居百货、玩具灯具等热门品类&#xff01;美国外观专利侵权判定采用“整体视觉相似”原则&#xff0c;不知情也可能被判侵权&a…

作者头像 李华
网站建设 2026/4/8 19:47:42

AdsPower指纹浏览器

链接&#xff1a;https://pan.quark.cn/s/b5d1b94c0a64AdsPower指纹浏览器是一款全球先进指纹浏览器&#xff0c;提供谷歌&火狐双内核浏览器&#xff0c;全方位帮您降低账号矩阵运营风险&#xff0c;与原生的谷歌浏览器相比&#xff0c;我们增加了管理浏览器指纹的功能&…

作者头像 李华