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之路的主要内容,如果未能解决你的问题,请参考以下文章