题目
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。
示例 1:
输入: [1,3,4,2,2]
输出: 2
示例 2:
输入: [3,1,3,4,2]
输出: 3
说明:
- 不能更改原数组(假设数组是只读的)。
- 只能使用额外的 O(1) 的空间。
- 时间复杂度小于 O(n2) 。
- 数组中只有一个重复的数字,但它
相关话题:数组,双指针,二分查找
我的思路:之前做了442442. 数组中重复的数据,和这个题目很像。
不过这个加了限制,原数组是只读的。它时间复杂度要求小于O(n2) 。
第一个比较容易想到的方法是二分查找。
求出中点mid,然后遍历整个数组,统计所有小于等于mid的数的个数,如果个数大于mid,则说明重复值在[mid+1, n]之间,反之,重复值应在[1, mid-1]之间,然后依次类推,直到搜索完成,此时的low就是我们要求的重复值。
然后提交后就看到了大佬们写的就是不一样,感觉查阅补习了一下,这个方法二,说实话思维还是要开放点。快慢指针找环入口
快慢指针的原理可以参考我写的
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;
}
}