题目描述:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAnYldHL0FWby9mZvwFN4ETMfdHLkVGepZ2XtxSZ6l2clJ3LcV2Zh1Wa9M3clN2byBXLzN3btgHL9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsQTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CMxkDO2YGM2UzYwUWY4AjNzYzXyMjN1ATMxAzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
思路:根据题目描述,n+1个空间只有范围为1~n的整数,所以必定存在重复数值,题目说有且仅有一个重复数值,所以,必定存在环。这里可以设置快慢指针。
慢指针:
t=nums[0]=1
t=nums[1]=3
t=nums[3]=2
t=nums[2]=4
t=nums[4]=2
t=nums[2]=4
…
快指针:
t=nums[nums[0]]=3
t=nums[nums[3]]=4
class Solution {
public:
int findDuplicate(vector<int>& nums) {
if(nums.size()>1){
int slow=nums[0];
int fast=nums[slow];
while(fast!=slow){
fast=nums[nums[fast]];
slow=nums[slow];
}
fast=0;//这步帮助理解
while(fast!=slow){
fast=nums[fast];
slow=nums[slow];
}
return slow;
}
return -1;
}
};