我正在解决一个问题,已经花了一些时间。
问题陈述:
给定一个由正数和负数组成的数组。如果索引处的数字n是正数,则向前移动n步。相反,如果它是负数(-n),则向后移动n步。假设数组的第一个元素与最后一个元素相邻,并且最后一个元素在第一个元素旁边。确定此数组中是否存在循环。循环从特定索引开始并以具有多个元素的特定索引结束。循环必须是“向前”或“向后”的。
示例1:给定数组[2, -1, 1, 2, 2],存在循环,从索引0 -> 2 -> 3 -> 0。
示例2:给定数组[-1, 2],不存在循环。
注意:给定数组保证不包含元素“0”。
你能在O(n)时间复杂度和O(1)空间复杂度下完成吗?
这是我的解决方案,但是如果没有检测到循环,我不确定如何结束do-while条件。我相信如果没有检测到循环,我的代码将无限运行。
public static boolean circularArrayLoop(int[] nums) {
int size = nums.length;
if(size < 2) return false;
int loopStart = nums[0];
int index = 0;
int start = nums[0];
do{
if(nums[index] > 0){
index = moveForward(index, nums[index], size);
}else {
index = moveBackward(index, Math.abs(nums[index]), size);
}
}while (loopStart != nums[index]);
}