这道题要好好读题,意思就是有一个环形数组,重点是这个环形数组,之前有个判断是否环形链表的题目,定义快慢指针,慢的每次走一步,快的走两步,一旦存在相等的情况,那么一定成环。本题就是在判断成环的过程中添加限制条件。
/* 题目中给的是一个环形数组,环形数组,那么快慢指针是一定能相遇的,程序要判断的是如果按照题目中的限制条件
去走的话能不能相遇*/
int GetNextIndex(int *nums, int numsSize, int curIndex)
{
return (((curIndex + nums[curIndex]) % numsSize + numsSize)) % numsSize;
}
bool circularArrayLoop(int* nums, int numsSize){
for (int i = 0; i < numsSize; ++i) {
int slow = i;
int fast = GetNextIndex(nums, numsSize, i);
while (nums[slow] * nums[fast] > 0 && nums[slow] * nums[GetNextIndex(nums, numsSize, fast)] > 0) {
if (slow == fast) {
if (slow != GetNextIndex(nums, numsSize, slow)) {
return true;
} else {
break;
}
}
slow = GetNextIndex(nums, numsSize, slow);
fast = GetNextIndex(nums, numsSize, GetNextIndex(nums, numsSize, fast));
}
int flag = i;
while (nums[flag] * nums[GetNextIndex(nums, numsSize, flag)] > 0) {
nums[flag] = 0;
flag = GetNextIndex(nums, numsSize, flag);
}
}
return false;
}