这题真是一个很好的二分题目,打破了往常的思维,二分不是二分数组的下标,而是二分1~n的取值范围。好比mid=1+n>>1,如果数值范围1~mid中没有重复的数那么小于等于mid的数最多有mid个,如果大于了mid说明1~mid中有重复的数。
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int n=nums.size();//n=n+1
int l=1,r=n-1,ans=0;
while(l<r)
{
int mid=(l+r)>>1;
int cnt=0;
for(int i=0;i<n;i++)
{
cnt+=nums[i]<=mid;
}
if(cnt>mid)r=mid;
else l=mid+1;
}
ans=l;
return ans;
}
};