给定一个长度为 n+1的数组nums
,数组中所有的数均在 1∼n 的范围内,其中 n≥1。
请找出数组中任意一个重复的数,但不能修改输入的数组。
样例
给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。
返回 2 或 3。
思考题:如果只能使用 O(1)O(1) 的额外空间,该怎么做呢?
强调了O(1) 的空间。 得考虑数字的特殊性。
区间统计法: 统计(遍历) l -> r 的所有 小于 mid的数量。 如果比mid还大,说明重复的数一定在 l ->mid之间。二分下去解决问题。
class Solution {
public:
int duplicateInArray(vector<int>& nums) {
int l = 1, r = nums.size() - 1 ;
while(l < r)
{
int mid = l + r >> 1;
int s = 0;
for(auto x:nums) s += x >=l && x <= mid;
if(s > mid - l +1) r = mid; //统计该区间的数量大于该区间的长度
else l = mid + 1;
}
return l;
}
};