本题源自leetcode 457
=----------------------------------------------------------------------
思路: 仿照链表,用快慢指针。遍历数组,每一个位置是否有环。
代码:
bool circularArrayLoop(vector<int>& nums) {
bool loop = false;
int n = nums.size();
if(n == 0)
return loop;
for(int i = 0; i < n && !loop; i++){
if(nums[i]){
int slow = i,fast = i;
int dir = nums[i]; //表示前进的方向
do{
slow = advanceBy(1,slow,nums,dir);
fast = advanceBy(2,fast,nums,dir);
}while(slow >= 0 && fast >= 0 && slow != fast);
if(slow >= 0 && fast >= 0 && slow == fast){
if(slow == advanceBy(1,slow,nums,dir)) //环就是数自己
nums[slow] = 0;
else
loop = true;
}
nums[i] = 0; //没有环就置为0
}
}
return loop;
}
int advanceBy(int step,int j,vector<int>& nums,int dir){
int n = nums.size();
for(;step; step--){
j = (j + nums[j] + n) % n; //避免了 j + nums[j] < 0
if(nums[j] * dir < 0) //当前方向与前进方向反向
return -1;
}
return j;
}