Problem
You are given an array of positive and negative integers. If a number n at an index is positive, then move forward n steps. Conversely, if it's negative (-n), move backward n steps. Assume the first element of the array is forward next to the last element, and the last element is backward next to the first element. Determine if there is a loop in this array. A loop starts and ends at a particular index with more than 1 element along the loop. The loop must be "forward" or "backward'.
Example 1: Given the array [2, -1, 1, 2, 2], there is a loop, from index 0 -> 2 -> 3 -> 0.
Example 2: Given the array [-1, 2], there is no loop.
Note: The given array is guaranteed to contain no element "0".
Can you do it in O(n) time complexity and O(1) space complexity?
Solution
class Solution {
public boolean circularArrayLoop(int[] nums) {
if (nums == null || nums.length <= 2) return false;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == 0) return false;
int slow = i, fast = getIndex(nums, i);
while (nums[fast] * nums[i] > 0 && nums[getIndex(nums, fast)] * nums[i] > 0) {
if (slow == fast) {
if (slow == getIndex(nums, slow)) break;
return true;
}
slow = getIndex(nums, slow);
fast = getIndex(nums, getIndex(nums, fast));
}
slow = i;
int pre = nums[i];
while (nums[slow] * pre > 0) {
int next = getIndex(nums, slow);
nums[slow] = 0;
slow = next;
}
}
return false;
}
private int getIndex(int[] nums, int i) {
int len = nums.length;
int next = i+nums[i];
return next >= 0 ? next%len : next%len+len;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。