题目链接
java
class Solution {
public int findDuplicate(int[] nums) {
int low = nums[0];
int fast = nums[nums[0]];
//1.快慢指针找相遇点
while (low != fast) {
low = nums[low];
fast = nums[nums[fast]];
}
//2.双指针找入环点
int pre = 0;
while (pre != low) {
pre = nums[pre];
low = nums[low];
}
return pre;
}
}
小结:对nums
数组建图,每个位置i
连一条i → nums[i]
的边。由于有且仅有唯一的重复数字target
,因此target
这个位置一定有起码两条指向它的边,因此整张图一定存在环,且我们要找到的target
就是这个环的入口,那么整个问题就等价于142. 环形链表 II。