leetcode每日一题:图中的最长环

题目
给你一个 n 个节点的 有向图 ,节点编号为 0 到 n - 1 ,其中每个节点 至多 有一条出边。
图用一个大小为 n 下标从 0 开始的数组 edges 表示,节点 i 到节点 edges[i] 之间有一条有向边。如果节点 i 没有出边,那么 edges[i] == -1 。
请你返回图中的 最长 环,如果没有任何环,请返回 -1 。
一个环指的是起点和终点是 同一个 节点的路径。
示例 1:

输入:edges = [3,3,4,2,3]
输出去:3
解释:图中的最长环是:2 -> 4 -> 3 -> 2 。
这个环的长度为 3 ,所以返回 3 。
示例 2:

输入:edges = [2,-1,3,1]
输出:-1
解释:图中没有任何环。
提示:
n == edges.length2 <= n <= 105-1 <= edges[i] < nedges[i] != i
思路
不要被难度级别“困难”吓倒,其实读懂题目后,好像也没那么难。题意说人话就是,有向图中每个节点最多只有1条出边,求这个图中最大的环包含的节点数量,如果没有环,则返回-1。
题目并不保证整个图是全部连通的,所以,我们可以先把这个图分成若干个不连通的部分,在每个部分内部,是连通的。那每个部分有如下三种情况
- 无环,是若干个存在公共节点的链表
- 有环,而且所有节点都在环内
- 有环,部分节点在环内,部分节点在环外
因为题目保证了每个节点最多只有1条出边,所以确定了起始点后,往后遍历的路径是唯一的。对于无环的情况,我们无论从哪个节点开始遍历,最后都不会成环;对于情况2和情况3有环的情况,无论我们从哪个节点开始遍历,最终一定可以遍历到环内的节点,且可以重复走到环内的每个节点。
所以,我们可以采取这样的策略,每次遍历一个节点,全局时间time++:外层,从下标0到n-1作为每个连通部分的起点进行遍历,内层,通过firstVisitTime[]数组来记录这个节点第一次被遍历到的时间,如果时间是0,证明这个节点没有被遍历过。另外,我们还需要一个变量记录每个连通部分第一次被遍历到的时间partBegin,如果firstVisitTime[i] >= partBegin,证明确实是在这个连通部分遍历的,那么当前时间减去firstVisitTime[i] 就是这个环的大小了。
图解

代码

public int longestCycle(int[] edges) {
int ans = -1;
int time = 0;
int[] firstVisitTime = new int[edges.length];
for (int i = 0; i < edges.length; i++) {
int index = i;
int partBegin = time;
while (index != -1 && firstVisitTime[index] == 0) {
firstVisitTime[index] = time++;
index = edges[index];
}
if (index != -1 && firstVisitTime[index] >= partBegin) {
ans = Integer.max(ans, time - firstVisitTime[index]);
}
}
return ans;
}
耗时

leetcode每日一题:图中的最长环的更多相关文章
- 【python】Leetcode每日一题-森林中的兔子
[python]Leetcode每日一题-森林中的兔子 [题目描述] 森林中,每个兔子都有颜色.其中一些兔子(可能是全部)告诉你还有多少其他的兔子和自己有相同的颜色.我们将这些回答放在 answers ...
- LeetCode每日一题打卡组队监督!刷题群!
近 2000 人已经加入共同刷题啦! 群友每天都会在群里给大家讲解算法题 每周日「负雪明烛」组织直播讲题 我相信来看我博客的大部分人都是通过LeetCode刷题过来的.最近发现LeetCode中文网站 ...
- 【python】Leetcode每日一题-寻找旋转排序数组中的最小元素
[python]Leetcode每日一题-寻找旋转排序数组中的最小元素 [题目描述] 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组nums ...
- 【python】Leetcode每日一题-删除有序数组中的重复项
[python]Leetcode每日一题-删除有序数组中的重复项 [题目描述] 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现一次 ,返回删除后数组的新长度. 不要 ...
- [LeetCode每日一题]153.寻找旋转排序数组中的最小值
[LeetCode每日一题]153.寻找旋转排序数组中的最小值 问题 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1, ...
- [LeetCode每日一题]80. 删除有序数组中的重复项 II
[LeetCode每日一题]80. 删除有序数组中的重复项 II 问题 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度. 不要使用额外 ...
- 【python】Leetcode每日一题-寻找旋转排序数组中的最小元素2
[python]Leetcode每日一题-寻找旋转排序数组中的最小元素2 [题目描述] 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组nums ...
- 【python】Leetcode每日一题-删除有序数组中的重复项2
[python]Leetcode每日一题-删除有序数组中的重复项2 [题目描述] 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度. 不 ...
- 【python】Leetcode每日一题-删除排序链表中的重复元素
[python]Leetcode每日一题-删除排序链表中的重复元素 [题目描述] 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 . 返回同 ...
- 【python】Leetcode每日一题-删除排序链表中的重复元素2
[python]Leetcode每日一题-删除排序链表中的重复元素2 [题目描述] 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表 ...
随机推荐
- CDS标准视图:设备功能位置变更历史 I_EQUIPINSTALLATIONHISTORYC
视图名称:I_EQUIPINSTALLATIONHISTORYC 视图类型:基础视图 视图代码: 点击查看代码 @EndUserText.label: 'Equipment Installation ...
- 权限对象:B_BUP_PCPT
权限对象:B_BUP_PCPT 事务代码: BUPA_PRE_EOP CVP_PRE_EOP(需要SFW5激活SAP Information Lifecycle Management,事务码IRMPO ...
- 微服务实战系列(九)-注册中心与网关高可用架构设计-copy
1. 微服务关系架构图 简要说明: (1)所有应用或者服务要想对外提供服务(包括网关),必须首先到注册中心进行注册. (2)所有访问通过服务网关进行访问,然后由服务网关路由到对应服务中心进行交互访问. ...
- MYSQL查询7天内、7月内的所有日期
select DATE_SUB(CURDATE(), INTERVAL 6 DAY) ; SELECT date_add( date_sub( ( SELECT DATE_SUB( curdate( ...
- 浅谈OpenStack(一)
本文分享自天翼云开发者社区<浅谈OpenStack(一)>,作者:EmmaDu OpenStack刚诞生的时候比较单纯,只有计算(NASA开源)和存储(Rackspace开源)两个功能组件 ...
- SqlServer性能检测之Sql语句排查
很多时候,我们在用SQL语句查询数据时,难免会漏掉对SQL语句性能的考虑,所以有时就会造成SqlServer服务占用过高的问题,为了大致排查是哪些SQL语句造成的问题,我们可以通过如下SQL查询出最近 ...
- 快速集成和使用 solon-flow 规则与流引擎(用 yaml 编写业务规则)
本文参考自:https://www.cnblogs.com/studyjobs/p/18125096 规则引擎技术的主要思想是将应用程序中的业务规则分离出来,业务规则不再以程序代码的形式驻留在系统中, ...
- PKUWC2025 游记
哈哈哈哈哈,我糖完了,哈哈哈哈哈. Day \(-998244353\) 被波波抓到机房充军集训去了,听到了很多新奇的算法,然后拼尽全力仍难以 \(AC\)--然后被各种巨佬疯狂单调队列. Day \ ...
- Arduino函数库和程序架构
Arduino程序的架构大体可分为3个部分. (1)声明变量及接口的名称. (2)setup().在Arduino程序运行时首先要调用setup()函数,用于初始化变量.设置针脚的输出/输入类型.配置 ...
- MDK Debug时No target connected,STM32 ST-LINK Utility连接不上单片机的解决办法“Can not connect to target!”
芯片下载程序成功,再次下载时出现,以下错误. 点击确认后,如下提示. 或提示如下. 不管怎么设置都侦测不到芯片. 使用STM32 ST-LINK Utility连接单片机时提示下边错误 "C ...