LeetCode 457 环形数组是否存在循环
🟠 中等偏上
https://leetcode.cn/problems/circular-array-loop/description/
依次检查
这里检查不用双指针,一个指针即可。
class Solution {
public:
bool circularArrayLoop(vector<int>& nums) {
int n = nums.size();
for(int i = 0;i<n;i++){
int count = 0;
int cur = i;
while(true){
// 正确返回的情况
if(cur==i&&count>1) return true;
int next = (cur+nums[cur]%n+n)%n;
//只有一步环
if(next==cur) break;
//中途反向
if(nums[next]*nums[cur]<=0) break;
// -------O 走到后面有环了。
if(count>n) return true;
count++;
cur = next;
}
}
return false;
}
};
vis数组
每次到一个新的位置,设置 vis[cur] 为起点位置;每次到一个位置,查看vis[cur] 是否有值,这个值可能是本轮之前到过然后设置的(这说明又环),也可能是上一轮或之前的轮遍历时设置的,既然之前设置的并且已经开启了新的一轮,这说明这个位置不在环中,直接开启下一轮。
class Solution {
public:
bool circularArrayLoop(vector<int>& nums) {
int n = nums.size();
vector<int> vis(n,-1);
for(int i = 0;i<n;i++){
int cur = i;
if(vis[cur]!=-1) continue;
while(true){
int next = (cur+nums[cur]%n+n)%n;
if(cur==next) break;
if(nums[cur]*(nums[next])%n<0) break;
if(vis[cur]!=-1){
if(vis[cur]==i){
return true;
}else{
break;
}
}
vis[cur] = i;
cur = next;
}
}
return false;
}
};