【发布时间】:2017-03-30 03:16:49
【问题描述】:
我正在解决一个问题,并且已经花费了一些时间。 问题陈述: 你得到一个正整数和负整数的数组。如果索引处的数字 n 为正,则向前移动 n 步。相反,如果它是负数 (-n),则向后移动 n 步。假设数组的第一个元素在最后一个元素的后面,最后一个元素在第一个元素的后面。确定此数组中是否存在循环。一个循环在一个特定索引处开始和结束,该索引沿循环有超过 1 个元素。循环必须是“向前”或“向后”。
示例 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]);
}
【问题讨论】:
-
如果数组中没有出现0,什么情况下可能没有循环? (如果方法只包含
return true;,它是否算作 O(0)? -
您可以计算循环直到大小。当计数等于大小时停止循环
-
我的理解:没有循环真的意味着“只有一个元素的循环”=>当一个元素指向自己时,这就是@Surace所说的。
-
“循环必须向前或向后”这是问题的一部分还是只是一个假设?