p135 查找重复数字(leetcode 287)

一:解题思路

用快慢指针法来解决这道题。

Time:O(n),Space:O(1)

二:完整代码示例 (C++版和Java版)

C++:

class Solution {
public:
    int findDuplicate(vector<int>& nums) 
    {
        int slow = nums[0];
        int fast = nums[nums[0]];
        while (fast != slow)
        {
            slow = nums[slow];
            fast = nums[nums[fast]];
        }
        int p = 0;
        while (p != slow)
        {
            slow = nums[slow];
            p = nums[p];
        }

        return slow;
    }
};

Java:

class Solution {
        public int findDuplicate(int[] nums) 
        {
               int fast=nums[nums[0]];
               int slow=nums[0];
               while (fast!=slow)
               {
                   slow=nums[slow];
                   fast=nums[nums[fast]];
               }
               int p=0;
               while (p!=slow)
               {
                   slow=nums[slow];
                   p=nums[p];
               }
               
               return slow;
        }
    }

猜你喜欢

转载自www.cnblogs.com/repinkply/p/12713781.html