判断环形数组是否存在循环

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;//保证每一步都在数组内
    }
}

以上是关于判断环形数组是否存在循环的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode457 环形数组是否存在循环[快慢指针] HERODING的LeetCode之路

数据结构与算法之深入解析“环形数组是否存在循环”的求解思路与算法示例

LeetCode 457. 环形数组是否存在循环(快慢指针判环)/1137. 第 N 个泰波那契数(矩阵快速幂)

判断环形数组是否存在环--强行dfs记忆化 or 快慢指针解决

判断链表是否环形

java实现环形队列