287. 寻找重复数
由于题目规定数组中的数的范围是1-n
,因此可以构造出下标n
和值nums[n]
的映射f(n)
,然后构成一个链表,当有重复数字时,链表存在环,找到重复数字即找到链表环的入口,参考142. 环形链表II。
class Solution {
public int findDuplicate(int[] nums) {
int slow = 0, fast = 0;
int n = nums.length;
while (fast < n && nums[fast] < n) {
slow = nums[slow];
fast = nums[nums[fast]];
if (slow == fast) break;
}
int p = 0;
while (true) {
if (p == slow) break;
p = nums[p];
slow = nums[slow];
}
return p;
}
}