首先,我们可以很容易地证明问题的约束意味着必须存在一个循环。因为 nums 中的每个数字都在 11 和 nn 之间,所以它必须指向存在的索引。此外,由于 00 不能作为 nums 中的值出现,nums[0] 不能作为循环的一部分。

    1. int findDuplicate(vector<int>& nums) {
    2. if(nums.empty())return 0;
    3. int fast = nums[0], slow = nums[0];
    4. do{
    5. fast = nums[nums[fast]];
    6. slow = nums[slow];
    7. }while(fast != slow);
    8. int len = 1;
    9. fast = nums[fast];
    10. while(fast != slow){
    11. fast = nums[fast];
    12. ++len;
    13. }
    14. fast = nums[0];
    15. slow = nums[0];
    16. for(int i = 0;i < len;++i)fast = nums[fast];
    17. while(fast != slow){
    18. fast = nums[fast];
    19. slow = nums[slow];
    20. }
    21. return fast;
    22. }