自学内容网 自学内容网

【LeetCode】【算法】287. 寻找重复数

LeetCode 287. 寻找重复数

题目描述

给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。
假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。
你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。

思路

思路:这道题可以理解为环形链表II的数组版本。
根据题解287.寻找重复数,得到的一个重要结论是从理论上讲,数组中如果有重复的数,那么就会产生多对一的映射,这样,形成的链表就一定会有环路了
所以类似于链表一样,弄一个快慢指针,慢指针一次一步,快指针一次两步,找到链表的环,再通过环形链表II中的x=z,弄一个从起点出发的指针和一个从快慢指针交汇处出发的指针,来找到这个环的入口(也就是重复数)

代码

class Solution {
    public int findDuplicate(int[] nums) {
        // 找环
        int slow = 0;
        int fast = 0;
        slow = nums[slow];
        fast = nums[nums[fast]];
        while (slow != fast) {
            slow = nums[slow];
            fast = nums[nums[fast]];
        }
        // 找交汇点
        int pre1 = 0;
        int pre2 = slow;
        while (pre1 != pre2) {
            pre1 = nums[pre1];
            pre2 = nums[pre2];
        }
        return pre1;
    }
}

原文地址:https://blog.csdn.net/passer__jw767/article/details/143608940

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!