首先,我们可以很容易地证明问题的约束意味着必须存在一个循环。因为 nums 中的每个数字都在 11 和 nn 之间,所以它必须指向存在的索引。此外,由于 00 不能作为 nums 中的值出现,nums[0] 不能作为循环的一部分。
int findDuplicate(vector<int>& nums) {if(nums.empty())return 0;int fast = nums[0], slow = nums[0];do{fast = nums[nums[fast]];slow = nums[slow];}while(fast != slow);int len = 1;fast = nums[fast];while(fast != slow){fast = nums[fast];++len;}fast = nums[0];slow = nums[0];for(int i = 0;i < len;++i)fast = nums[fast];while(fast != slow){fast = nums[fast];slow = nums[slow];}return fast;}
