给定一个长度为n+1的数组 nums,数组中所有数都在1-n范围内,其中n>=1;
查找数组中任意一个重复的数;
将数字范围1-n作为二分查找的左右区间,l=1,r=n;mid=(l+r)/2;如果数值落在l-mid上的数的个数比左区间的长度大,则说明左区间有重复数字,否则右区间有重复数字;
int duplicate(vector<int>& nums)
{
int l=1,r=nums.size()-1;
while(l<r)
{
int mid=l+r>>1;//[l,mid][mid+1,r]
int s=0;//计数:计算落入左区间的数字个数
for(auto x: nums)
s+= x>=1 && x<=mid;
if(s> mid - l +1) r=mid;
else l=mid+1;
}
return r;
}