p135 查找重复数字(leetcode 287)

一:解题思路

用快慢指针法来解决这道题,效率是最高的。从下标为0开始,以每次下标开始读数组,肯定会形成一个圆环。此时,用快慢指针从头部开始走,最终快慢指针肯定会相遇在某个地方。此时,再用另外一个指针指向头部,和慢指针一次走一步,最终他们会相遇到圆环的开始节点。

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;
        }
    }

 

posted @ 2020-04-16 16:34  repinkply  阅读(99)  评论(0)    收藏  举报