查找数组中重复项的直观解释

时间:2017-10-06 00:51:22

标签: c++

给定包含n+1个元素的数组,其中每个元素在1n之间(包括),至少有一个数字是重复的。我的目标是找到重复的一个。请注意,此单个数字可以重复多次。

我发现了以下高度推崇的代码。虽然我理解如何为什么它起作用,但我正在寻求一个直观的解释:

class Solution {
public:

    int findDuplicate(vector<int>& nums) {
        if(nums.empty())
            return -1;

        int slow=nums[0];
        int fast=nums[nums[0]];

        while(slow!=fast) {
            slow=nums[slow];
            fast=nums[nums[fast]];
        }

        fast=0;
        while(slow!=fast) {
            slow=nums[slow];
            fast=nums[fast];
        }

        return fast;
    }
};

问题链接:https://leetcode.com/problems/find-the-duplicate-number/description/

使用铅笔和纸,我可以理解两个指针是如何移动的,最后是单个重复数字。但它如何直观地工作?

修改:链接到高度赞成的解决方案:https://discuss.leetcode.com/topic/25913/my-easy-understood-solution-with-o-n-time-and-o-1-space-without-modifying-the-array-with-clear-explanation

0 个答案:

没有答案