思路:
我们观察后发现我们返回的位置其实就是数组中第一个nums[index] != index的位置,故这题可以转化为寻找所有满足nums[index] != index的左边界对应的index问题,那么就可以使用我们二分查找中寻找左边界的代码框架(这里我们采用左闭合右闭合区间搜索法)
int missingNumber(vector<int>& nums) {
int n=nums.size();
int l=0,r=n-1;
while(l<=r){
int mid=(l+r)/2;
if(nums[mid]==mid)
l=mid+1;
else
r=mid-1;
}
return l;
}
当然换成左闭右开区间搜索也可以:
int missingNumber(vector<int>& nums) {
int n=nums.size();
int l=0,r=n;
while(l<r){
int mid=(l+r)/2;
if(nums[mid]==mid)
l=mid+1;
else
r=mid;
}
return l;
}
关于左闭右闭、左闭右开区间搜索法;二分查找寻找左边界、二分查找寻找右边界问题详述请看我的专栏:算法之二分查找理论(三种问题类型、两种算法形式)