题面
题解
- 如果可以使用额外的数组,我们可以新开一个数组统计每个数出现的个数即可
- 这题我们可以用二分来做,因为n+1个在1-n的数一定有两个数是重复的,那么我们每次以中间值二分,那么左右一定有一个区间的数的个数是大于它的l-mid+1的,这个大于的就是重复的数
代码
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) {
if(x>=l&&x<=mid){
s++;
}
}
if(s>mid-l+ 1) r = mid;
else l = mid + 1;
}
return l;
}
};