Leetcode287 寻找重复数

给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。

假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。

你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。

思路:

我们对nums 数组建图,每个位置i连一条i→nums[i] 的边。由于存在的重复的数字target,因此 target 这个位置一定有起码两条指向它的边,因此整张图一定存在环,且我们要找到的target 就是这个环的入口,那么整个问题就等价于 142. 环形链表 II。

如果数组中有重复的数,以数组 [1,3,4,2,2] 为例,我们将数组下标 n 和数 nums[n] 建立一个映射关系 f(n),
其映射关系 n->f(n) 为:
0->1,1->3,2->4,3->2,4->2
同样的,我们从下标为 0 出发,根据 f(n)计算出一个值,以这个值为新的下标,再用这个函数计算,以此类推产生一个类似链表一样的序列。
0->1->3->2->4->2->4->2->……
这里2->4是一个循环,那么这个链表可以抽象为下图:

Leetcode287 寻找重复数_第1张图片

该链表即为有环链表,使用快慢指针即可找到重复数。
实现代码

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

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

    }
}

你可能感兴趣的:(数组,快慢指针,重复元素)