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

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode457 环形数组是否存在循环[快慢指针] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。


解题思路:
一道经典的快慢指针的题目,定义快慢指针,一旦追上,并且不是一个单独数单独循环,则说明存在环,否则从下一个数出发,为了避免重复的无效循环, 把循环过的部分并且不满足成环标记为0,这样遇到直接跳过,代码如下:

class Solution {
public:
    bool circularArrayLoop(vector<int>& nums) {
        int len = nums.size();
    
        // 定义函数,限制下一位位置,保证在环内
        auto next = [&](int index) {
            return ((index + nums[index]) % len + len) % len;
        };

        for(int i = 0; i < len; i ++) {
            // 遍历过的点判断无法成环,不再遍历
            if(nums[i] == 0) {
                continue;
            }
            int slow = i;
            int fast = next(i);
            // 符号相同保证是同一个方向移动
            while(nums[slow] * nums[fast] > 0 && nums[slow] * nums[next(fast)] > 0) {
                // 如果相遇
                if(slow == fast) {
                    // 如果不是单独一个循环
                    if(slow != next(slow)) {
                        return true;
                    } else {
                        break;
                    }
                }
                // 更新快慢指针
                slow = next(slow);
                fast = next(next(fast));
            }
            // 不满足成环条件,标记为0,避免下次再次陷入
            while(nums[i] * nums[next(i)] > 0) {
                int temp = i;
                i = next(i);
                nums[temp] = 0;
            }
        }
        return false;
    }
};

以上是关于LeetCode457 环形数组是否存在循环[快慢指针] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

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

算法-leetcode-142. 环形链表 II

leetcode 141.环形链表

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

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

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