287. 寻找重复数

题目

给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。

示例 1:

输入: [1,3,4,2,2]
输出: 2
示例 2:

输入: [3,1,3,4,2]
输出: 3
说明:

  1. 不能更改原数组(假设数组是只读的)。
  2. 只能使用额外的 O(1) 的空间。
  3. 时间复杂度小于 O(n2) 。
  4. 数组中只有一个重复的数字,但它

相关话题:数组,双指针,二分查找


我的思路:之前做了442442. 数组中重复的数据,和这个题目很像。
不过这个加了限制,原数组是只读的。它时间复杂度要求小于O(n2) 。

  1. 第一个比较容易想到的方法是二分查找。
    求出中点mid,然后遍历整个数组,统计所有小于等于mid的数的个数,如果个数大于mid,则说明重复值在[mid+1, n]之间,反之,重复值应在[1, mid-1]之间,然后依次类推,直到搜索完成,此时的low就是我们要求的重复值。
    然后提交后就看到了大佬们写的就是不一样,感觉查阅补习了一下,这个方法二,说实话思维还是要开放点。

  2. 快慢指针找环入口
    快慢指针的原理可以参考我写的
    https://blog.csdn.net/weixin_39789689/article/details/82421684
    题目给出条件数组值在1~n 所以可以用这个解。

方法2参考代码(别人写的):

class Solution {
    public int findDuplicate(int[] nums) {
        int speedX1 = 0;
        int speedX2 = 0;

        do {
            speedX1 = nums[speedX1];
            speedX2 = nums[nums[speedX2]];
        }while (speedX1 != speedX2);

        speedX1 = 0;
        while (speedX1 != speedX2) {
            speedX1 = nums[speedX1];
            speedX2 = nums[speedX2];
        }

        return speedX1;        
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_39789689/article/details/82420653