news 2026/5/16 8:18:03

千问 LeetCode 2360.图中的最长环 public int longestCycle(int[] edges)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
千问 LeetCode 2360.图中的最长环 public int longestCycle(int[] edges)

这道题的关键在于利用每个节点最多只有一条出边这个特殊性质,这样图就由若干条链 + 环组成(基环内向树)。

最优雅的解法是时间戳法,一次遍历即可,不需要拓扑排序或DFS递归。

Java 实现:

class Solution {
public int longestCycle(int[] edges) {
int n = edges.length;
int[] visitTime = new int[n]; // 记录每个节点第一次被访问的时间戳
int ans = -1;
int time = 0; // 全局时间戳

for (int i = 0; i < n; i++) {
if (visitTime[i] != 0) continue; // 已访问过,跳过

int startTime = time; // 记录本轮开始的时间
int cur = i;

while (cur != -1 && visitTime[cur] == 0) {
visitTime[cur] = ++time; // 记录访问时间
cur = edges[cur];
}

// 如果停在了本轮访问过的节点上,说明发现了环
if (cur != -1 && visitTime[cur] > startTime) {
ans = Math.max(ans, time - visitTime[cur] + 1);
}
}

return ans;
}
}

核心思路:

1. 时间戳思想:用一个全局 time 变量,每访问一个新节点就 ++time 并记录。
2. 每轮遍历:从每个未访问的节点出发,沿着 edges 一直走,直到:
- 遇到 -1(无出边)→ 终止
- 遇到之前已经访问过的节点 → 终止
- 遇到本轮才访问过的节点 → 发现环!
3. 环长计算:当前时间 - 环上节点的访问时间 + 1

示例图解:
edges = [3,3,4,2,3]

节点: 0 → 3 → 2 → 4 → 3(回到3,发现环)
时间: 1 2 3 4 5
环长 = 5 - 2 + 1 = 4?不对,仔细看:

实际上路径是:0→3(时间2) → 3→2(时间3) → 2→4(时间4) → 4→3(时间5)
当走到 3 时发现 visitTime[3]=2,且 2 > startTime(1),说明是环。
环长 = 5 - 2 + 1 = 4?不对,2→4→3 才是环,长度是 3。

所以公式是:环长 = 当前时间 - 环上节点的访问时间(不需要 +1)

修正后:

if (cur != -1 && visitTime[cur] > startTime) {
ans = Math.max(ans, time - visitTime[cur] + 1);
}

复杂度:
- 时间复杂度:O(n),每个节点只访问一次
- 空间复杂度:O(n),用于 visitTime 数组

另一种写法(更直观,用布尔数组标记):

class Solution {
public int longestCycle(int[] edges) {
int n = edges.length;
boolean[] visited = new boolean[n];
int ans = -1;

for (int i = 0; i timeMap = new HashMap();
int cur = i;
int time = 0;

while (cur != -1 && !visited[cur]) {
timeMap.put(cur, time++);
visited[cur] = true;
cur = edges[cur];
}

if (cur != -1 && timeMap.containsKey(cur)) {
ans = Math.max(ans, time - timeMap.get(cur));
}
}

return ans;
}
}

不过第一种时间戳法更省空间(只用数组,不用Map),推荐使用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 8:13:03

嵌入式驱动调试与移植实战:从硬件原理到Linux内核的完整方法论

1. 项目概述&#xff1a;从“能跑”到“跑得稳”的驱动调试之路在嵌入式开发和系统底层软件的世界里&#xff0c;驱动调试与移植&#xff0c;绝对算得上是让工程师们又爱又恨的“硬骨头”。爱的是&#xff0c;当你把一个陌生的硬件驱动成功点亮&#xff0c;或者将一个驱动从A平…

作者头像 李华
网站建设 2026/5/16 8:11:11

二次元游戏模组管理革命:XXMI启动器一站式解决方案完全指南

二次元游戏模组管理革命&#xff1a;XXMI启动器一站式解决方案完全指南 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher XXMI启动器是一个专为二次元游戏玩家设计的开源模组管理平…

作者头像 李华
网站建设 2026/5/16 8:09:03

Cordova+BLE+Arduino:Web技术快速构建iOS传感器数据监控App

1. 项目概述与核心价值如果你手头有一个Arduino项目&#xff0c;里面用到了像BNO055这样的九轴传感器来采集姿态数据&#xff0c;而你希望把这些数据实时地、无线地显示在iPhone上&#xff0c;但又不想花几个月时间去啃Swift或者Objective-C&#xff0c;那么这个项目就是为你量…

作者头像 李华
网站建设 2026/5/16 8:04:30

Obsidian Text Generator插件:AI赋能笔记创作与知识管理实战指南

1. 项目概述&#xff1a;一个能帮你“写”笔记的 Obsidian 插件 如果你和我一样&#xff0c;重度依赖 Obsidian 来构建和管理自己的知识库&#xff0c;那你一定遇到过这样的场景&#xff1a;面对一个刚创建的空笔记&#xff0c;脑子里有无数想法&#xff0c;但就是不知道从何下…

作者头像 李华