给定包含n+1
个元素的数组,其中每个元素在1
和n
之间(包括),至少有一个数字是重复的。我的目标是找到重复的一个。请注意,此单个数字可以重复多次。
我发现了以下高度推崇的代码。虽然我理解如何和为什么它起作用,但我正在寻求一个直观的解释:
class Solution {
public:
int findDuplicate(vector<int>& nums) {
if(nums.empty())
return -1;
int slow=nums[0];
int fast=nums[nums[0]];
while(slow!=fast) {
slow=nums[slow];
fast=nums[nums[fast]];
}
fast=0;
while(slow!=fast) {
slow=nums[slow];
fast=nums[fast];
}
return fast;
}
};
问题链接:https://leetcode.com/problems/find-the-duplicate-number/description/
使用铅笔和纸,我可以理解两个指针是如何移动的,最后是单个重复数字。但它如何直观地工作?