当前位置: 首页 > wzjs >正文

做单位网站的公司城乡住房和城乡建设部网站

做单位网站的公司,城乡住房和城乡建设部网站,手机wap版网站制作,精准营销英文【LetMeFly】2360.图中的最长环:一步一打卡(不撞南墙不回头) - 通过故事讲道理 力扣题目链接:https://leetcode.cn/problems/longest-cycle-in-a-graph/ 给你一个 n 个节点的 有向图 ,节点编号为 0 到 n - 1 ,其中每个节点 至多…

【LetMeFly】2360.图中的最长环:一步一打卡(不撞南墙不回头) - 通过故事讲道理

力扣题目链接:https://leetcode.cn/problems/longest-cycle-in-a-graph/

给你一个 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.length
  • 2 <= n <= 105
  • -1 <= edges[i] < n
  • edges[i] != i

解题方法:一步一打卡(不撞南墙不回头)

故事

小T爱跑图,她有如下爱好:

  1. 只跑没跑到过的景点
  2. 不撞南墙不回头(一直跑下去,直到跑到一个跑到过的景点)
  3. 爱打卡(第一次跑到一个景点,就打卡记录下“这是我解锁的第xx个城市”)

小T跑完所有景点,这道题就解决了。

原理解析

这得益于每个景点最多只有一个“下一个景点”(每个节点至多有一条出边)。

  • 如果小T的起点在环的任意一个位置:

    小T一定会再次回到自己的起点(然后发现这里来过了,撞到了南墙,不再继续此路线)。

    由于记录了自己的打卡记录,所以只需要判断一下上次到这里是“解锁的第几个城市”,再看看本次到这里时一共解锁了几个城市,相减就能得到这个环的长度。

  • 如果小T的起点不在环上:

    • 如果是一条单链:则要么会跑到终点后无路可走,要么会跑到一个去过的景点,小T不再继续此路线

    • 如果是一条指向一个环的链:那么终将走到环上

      • 如果环还没有被走过,那么绕环跑一圈后就会得出环长
      • 如果环已经被走过了,那么小T不再继续此路线

具体实现

使用一个 v i s i t e d visited visited数组记录一下每个景点的打卡记录,使用 c n t cnt cnt记录即将要解锁的城市是第几个。

从任意一点开始尝试,按照小T的跑法开始模拟,遇到新城市就打卡记录并尝试继续,直到到达终点或遇到了去过的城市为止。

小T停止这条路线后:

  • 如果停止位置指向下一个城市( e d g e s [ i ] ≠ − 1 edges[i]\neq -1 edges[i]=1),则说明是到达了去过的城市(而不是达到了单链的终点)
  • 并且如果该城市的打卡记录不早于本次路线的开始时间,则说明是本次跑步过程中遇到的城市,说明有环

什么意思呢?小T开始一条新的路线时,还需要记录一下新路线开始时一共打卡了多少城市。

遇到了一个去过城市,如果打卡记录编号很小(不是本次路线上遇到的,而是之前经过的),就不能说明有环。

反之,如果这个去过的城市是本次线路上二次遇到的,就说明有环。

时空复杂度分析

  • 时间复杂度 O ( n ) O(n) O(n)
  • 空间复杂度 O ( n ) O(n) O(n)

AC代码

C++
/** @Author: LetMeFly* @Date: 2025-03-29 10:47:24* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-03-29 11:47:35* @Description: AC,93.64%,86.13%*/
/*
[3,3,4,2,3]0 1 2 3 41↓
0-----> 3 <----- 4 |        ↑↓        |2 -------+
*//*0  1 2 3
[2,-1,3,1]0-->2-->3-->1*//*0 1 2 3  4  5
[5,2,3,1,-1,-1]0-->5      41---->2↖ ↙3
*/
class Solution {
public:int longestCycle(vector<int>& edges) {int ans = -1;int cnt = 1;vector<int> visited(edges.size());for (int i = 0; i < edges.size(); i++) {int begin = cnt, x = i;while (edges[x] != -1 && !visited[x]) {visited[x] = cnt++;x = edges[x];}if (edges[x] != -1 && visited[x] >= begin) {ans = max(ans, cnt - visited[x]);}}return ans;}
};#ifdef _WIN32
int main() {string s;while (cin >> s) {vector<int> v = stringToVector(s);Solution sol;cout << sol.longestCycle(v) << endl;}return 0;
}
#endif
Python
'''
Author: LetMeFly
Date: 2025-03-29 14:06:24
LastEditors: LetMeFly.xyz
LastEditTime: 2025-03-29 14:09:27
'''
from typing import Listclass Solution:def longestCycle(self, edges: List[int]) -> int:ans = -1cnt = 1visited = [0] * len(edges)for i in range(len(edges)):begin = cntwhile edges[i] != -1 and not visited[i]:visited[i] = cntcnt += 1i = edges[i]if edges[i] != -1 and visited[i] >= begin:ans = max(ans, cnt - visited[i])return ans
Java
/** @Author: LetMeFly* @Date: 2025-03-29 14:10:15* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-03-29 14:15:56*/
class Solution {public int longestCycle(int[] edges) {int ans = -1;int cnt = 1;int[] visited = new int[edges.length];for (int i = 0; i < edges.length; i++) {int begin = cnt;int x = i;while (edges[x] != -1 && visited[x] == 0) {visited[x] = cnt++;x = edges[x];}if (edges[x] != -1 && visited[x] >= begin) {ans = Math.max(ans, cnt - visited[x]);}}return ans;}
}
Go
/** @Author: LetMeFly* @Date: 2025-03-29 14:16:26* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-03-29 14:18:33*/
package mainfunc longestCycle(edges []int) int {ans := -1cnt := 1visited := make([]int, len(edges))for i := range edges {begin := cntfor edges[i] != -1 && visited[i] == 0 {visited[i] = cntcnt++i = edges[i]}if edges[i] != -1 && visited[i] >= begin {ans = max(ans, cnt - visited[i])}}return ans
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源


文章转载自:

http://5lGC7KU8.yhrrL.cn
http://6Gkpy9rt.yhrrL.cn
http://lJ2BAlVX.yhrrL.cn
http://CDKRbD66.yhrrL.cn
http://yTOBjewU.yhrrL.cn
http://rvxvHVSh.yhrrL.cn
http://YGtxAdMh.yhrrL.cn
http://unE2qY7c.yhrrL.cn
http://bJ2sZyDN.yhrrL.cn
http://yY3Pe1UA.yhrrL.cn
http://XTxtwZU5.yhrrL.cn
http://BPy7PMrk.yhrrL.cn
http://EX4fQ5vZ.yhrrL.cn
http://nySZuO1L.yhrrL.cn
http://TTWgvHrF.yhrrL.cn
http://wEfNbIPz.yhrrL.cn
http://EyUPhksg.yhrrL.cn
http://L9HvqpZL.yhrrL.cn
http://yBOttvXL.yhrrL.cn
http://FV1CtyMY.yhrrL.cn
http://HRhSU4za.yhrrL.cn
http://BC62wC3A.yhrrL.cn
http://qnH4VMmK.yhrrL.cn
http://LA9itarF.yhrrL.cn
http://VuA4CDzy.yhrrL.cn
http://9FYiWD5P.yhrrL.cn
http://jKcoe5MH.yhrrL.cn
http://5Ife0S3R.yhrrL.cn
http://LFubn70E.yhrrL.cn
http://hO3lnGZR.yhrrL.cn
http://www.dtcms.com/wzjs/764427.html

相关文章:

  • 陵水网站建设报价沈阳seo全网营销
  • 做网站可行性分析微信软文范例
  • h5美食制作网站模板沈阳建设网站服务公司
  • 成都网站建设 公司网站设计 网站建设 手机网站建设
  • 公司网站制作效果网页打不开是什么问题
  • 做殡葬名片的网站jsp可以做网站吗
  • 吐鲁番高端网站建设平台wordpress 主題
  • 网站建设PHP开发是什么意思建网站能赚钱吗
  • 购物网站模块例子湖南seo优化
  • 网站建设平台价格在线登录qq邮箱网页版官网
  • 政务网站建设经验做法大型网站开发成本
  • 品牌宝网站认证河南郑州最新新闻
  • 蝶山网站建设厦门住房和城乡建设局网站
  • 常山网站建设公司做网页推广要多少钱
  • 网站推广策划思路是什么建设企业银行u盾如何使用
  • 大庆网站建设专业的免费网站建设
  • 商城微网站如何做外贸牛
  • 网站怎么制作软件筑龙网登录
  • 商贸营销型网站案例做非法网站的有没有
  • 江门网站关键词推广wordpress模版教程
  • 桂林网站建站企业信用公示网上查询平台
  • 网站空间去哪里买的邢台手机网站建设多少钱
  • 燕郊做网站的公司电销app
  • 做家常便饭网站建设网站公司选哪家好
  • 上海做网站制作公司品牌营销策划
  • 旅游网站开发费用如何制作微信小程序店铺
  • 网站内的地图导航怎么做的网络营销的网站
  • 怎么做一个公司网站网络营销是什么行业
  • 网站建设 营销wordpress 文章内容页
  • 做网站开发需要学哪些东西郴州新网招聘官网