Day15 leetcode寻找重复数

problem describe:

给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。
说明:
不能更改原数组(假设数组是只读的)。
只能使用额外的 O(1) 的空间。
时间复杂度小于 O(n2) 

数组中只有一个重复的数字,但它可能不止重复出现一次。
解法:由于题目的限制条件较多,所以实现的难点在于限制条件,只能用O(1)的空间且不能改变数组。所以不能用排序的方法找出重复数(虽然可以提交通过),在讨论区看到老外用快慢指针的方法,用两个指针,快指针一次走两步,而慢指针一次走一步,但它们走的路径时一样的,当slow和fast指针走到重复数的时候,他会陷入一个循环,而循环的入口就是数组中的重复数字,当slow和fast相等时,说明它们陷入了循环,此时我们把fast重置为0并将其变为一次走一步,此时,若fast==slow时,说明它们在循环的入口(即重复点)相遇了,此时fast和slow指向的就是重复数字。

代码实现

class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        int fast=nums[nums[0]];
        int slow=nums[0];
        if(nums.size()>1)
        {   while(slow!=fast)
            {
                slow=nums[slow];
                fast=nums[nums[fast]];//slow走一步,fast走两步
            }
            fast=0;
            while(fast!=slow)
            {
                fast=nums[fast];
                slow=nums[slow];
            }//这个循环结束后slow和fast在循环的入口相遇
         return fast;
        }
        return -1;
    }
};

猜你喜欢

转载自blog.csdn.net/shine10076/article/details/82778913