判断环形数组是否存在循环
Posted 秦枫-_-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断环形数组是否存在循环相关的知识,希望对你有一定的参考价值。
这道题解读:
首先是 给定的数组一定有环,但是这个环不能是自环且必须是「同向」才合法,因此如果我们在遍历过程中发现存在反向,就停止检查,并且把存在反向环的节点都标记为0,如此以后在遇到这些点就可以直接跳过,因为题目给定的每个点都只有一个唯一的出路,所以不用担心会判断错误
具体地,我们检查每一个节点,令快慢指针从当前点出发,快指针每次移动两步,慢指针每次移动一步,期间每移动一次,我们都需要检查当前单向边的方向是否与初始方向是否一致,如果不一致,我们即可停止遍历,因为当前路径必然不满足条件。如果在一个符合题意的环中,快指针一定会赶上慢指针,那么只要相遇的时候判断是否相等并且不是自环即可。
class Solution
int []num;
int n;
public boolean circularArrayLoop(int[] nums)
this.num=nums;
this.n=nums.length;
for(int i=0;i<n;i++)
if(nums[i]==0)continue;
int slow=i,fast=next(i);
while(nums[slow]*nums[fast]>0&&nums[slow]*nums[next(fast)]>0)
if(slow==fast)
if(slow==next(slow))break;//说明是自环,不符合题意
else return true;
slow=next(slow);
fast=next(next(fast));
int add = i;
while (nums[add] * nums[next(add)] > 0) //把不符合题目的点都做标记0,后续遇到后直接跳过
int tmp = add;
add = next(add);
nums[tmp] = 0;
return false;
public int next(int cur)
return ((cur+num[cur])%n+n)%n;//保证每一步都在数组内
以上是关于判断环形数组是否存在循环的主要内容,如果未能解决你的问题,请参考以下文章
数据结构与算法之深入解析“环形数组是否存在循环”的求解思路与算法示例
LeetCode 457. 环形数组是否存在循环(快慢指针判环)/1137. 第 N 个泰波那契数(矩阵快速幂)
判断环形数组是否存在环--强行dfs记忆化 or 快慢指针解决