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'.oop
Example 1: Given the array [2, -1, 1, 2, 2], there is a loop, from index 0 -> 2 -> 3 -> 0.this
Example 2: Given the array [-1, 2], there is no loop.spa
Note: The given array is guaranteed to contain no element "0".code
Can you do it in O(n) time complexity and O(1) space complexity?ci
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; } }