先上代码:
var findDuplicate = function(nums){
if (nums.length > 1){
var slow = nums[0];
var fast = nums[nums[0]];
while (slow != fast){
slow = nums[slow];
fast = nums[nums[fast]];
}
fast = 0;
while (fast != slow){
fast = nums[fast];
slow = nums[slow];
}
return slow;
}
return -1;
};
这道题的思路非常巧妙。由于本道题的条件是:
array nums containing n + 1 integers where each integer is between 1 and n。
基于这样的条件,我们可以把数组看作一个链表,数组的下标表示的是该链表的位置,数组的元素表示的是下一个“链表”的位置。那么,因为这个数组中有且只有一个元素是会重复的,那么就导致这个“链表”中会有环。这道题就相当于是转化成了寻找链表中环的入口元素的问题。可以使用快慢指针的方法。