1、前言
题目描述2、思路
思路就是快慢指针,将数组想象成一个环。比如假设有这样一个样例:[1,2,3,4,5,6,7,8,9,5]。如果我们按照上面的循环下去就会得到这样一个路径: 1 2 3 4 5 [6 7 8 9] [6 7 8 9] [6 7 8 9] . . .这样就有了一个环,也就是6 7 8 9。point 会一直在环中循环的前进。
初始时,我们以数组的下表作为指针,然后可以将数组的元素作为指针(毕竟有元素才重复),然后思路就转变成上题中,求环入口处的节点了。
3、代码
class Solution {
public int findDuplicate(int[] nums) {
int fast = 0;
int slow = 0;
while(true){
fast = nums[nums[faast]];
slow = nums[slow];
if(fast == slow){
break;
}
}
int finder = 0;
while(true){
finder = nums[finder];
slow = nums[slow];
if(finder == slow){
break;
}
}
return slow;
}
}
网友评论