题目描述
给定一个长度为 n+1 的数组nums,数组中所有的数均在 1∼n 的范围内,其中 n ≥ 1。
请找出数组中任意一个重复的数,但不能修改输入的数组。
样例
输入样例:
nums = [2, 3, 5, 4, 3, 2, 6, 7]
输出样例
2或3
思路
用数组下标作为判定标准
将数组下标进行二分,计算在左半边数据个数,如果左半边数据个数大于左半边最大可能的满足个数,说明左半边数据有重复
算法(二分)
class Solution {
public:
int duplicateInArray(vector<int>& nums) {
int l = 1, r = nums.size() - 1;
while (l < r)
{
int s = 0, mid = l + r >> 1;
for (auto x : nums)
s += (x >= l && x <= mid); // 计算左边范围个数
if (s > mid - l + 1)
r = mid;
else
l = mid + 1;
}
return r;
}
};
你这是错的
已修改
原数据比较弱错误写法也过了,边界写快了