
/**
结论:
例[1,3,4,2,2]
nums[0]、nums[nums[0]]、nums[nums[nums[0]]]、nums[nums[nums[nums[0]]]]、nums[nums[nums[nums[nums[0]]]]]
将这几个元素一次串起来形成一个链表: 1-->3-->2-->4-->2-->4-->2.....,该链表会存在一个环,环的入口即为重复的元素
环形链表的入口:
快指针两步/次 慢指针一步/次 相对速度为1 快指针必然和慢指针相遇,不会跳过慢指针
当快慢指针在环内相遇时,再从起点出发一个慢指针,两慢指针相遇点必然是环入口点
*/
class Solution {
/**
结论:
例[1,3,4,2,2]
nums[0]、nums[nums[0]]、nums[nums[nums[0]]]、nums[nums[nums[nums[0]]]]、nums[nums[nums[nums[nums[0]]]]]
将这几个元素一次串起来形成一个链表: 1-->3-->2-->4-->2-->4-->2.....,该链表会存在一个环,环的入口即为重复的元素
环形链表的入口:
快指针两步/次 慢指针一步/次 相对速度为1 快指针必然和慢指针相遇,不会跳过慢指针
当快慢指针在环内相遇时,再从起点出发一个慢指针,两慢指针相遇点必然是环入口点
*/
public int findDuplicate(int[] nums) {
int slow = 0, fast = 0;
while(true) {
slow = nums[slow];
fast = nums[nums[fast]];
if(slow == fast) {
break;
}
}
int slow2 = 0;
while(true) {
slow = nums[slow];
slow2 = nums[slow2];
if(slow == slow2) {
return slow;
}
}
}
}

被折叠的 条评论
为什么被折叠?



