来自力扣457. 环形数组是否存在循环
为什么要%n +n 再%n, 直接%n有什么问题?
- 负数取模;
- 直接%可能出负数;
- cur + nums[cur]存在小于0的可能;
- 只做 (cur + nums[cur]) % n这个只能处理正方向,如果是负的,就是反方向,需要先%n确保在范围内,然后+n再%n起到一个向左的效果;
- 会出现 (cur + nums[cur]) % n == len(nums) 的情况,故后跟 …%n 将其转化为 0;
- 不行,比如cur = 2,nums[cur] = -9,n = 5,(cur + nums[cur]) % n = -2;
负数对正数取模得到负数是由语言本身决定的,可以参考; - 因为在c++语法里这样算余数是会出负数的,所以加上n在 % n就没事了,首先也要 % n是因为防止负数和过大,加一个n不够;
- 试一下[-2,-3,-9]这个数据。
public class Solution {
int[] nums;
int n;
public boolean circularArrayLoop(int[] nums) {
this.n = nums.length;
this.nums = nums;
// 根据题意,起点seq[0]可能不从下标0开始
for (int i = 0; i < n; i++) {
int slow = i, fast = next(i);
// 检查同向
while (nums[fast] * nums[slow] > 0 && nums[nums[fast]] * nums[slow] > 0) {
if (fast == slow) {
//存在长度k为1的同向环
if (slow == next(slow)) {
break;
}
//否则满足要求
else {
return true;
}
}
// 指针移动
fast = next(next(fast));
slow = next(slow);
}
}
return false;
}
public int next(int i) {
return ((i + nums[i]) % n + n) % n;
}
}