class Solution {
public int missingNumber(int[] nums) {
//二分法 找到位数与数字不相等的第一个数字,减去1即为所求
if(nums==null || nums.length==0){
return -1;
}
return findNumber(nums,0,nums.length-1);
}
public int findNumber(int[] nums,int left,int right){
while(left<=right){
int mid= (left+right)>>1;
if(nums[mid]==mid){
//如果相等,说明缺失的位还在右边
left=mid+1;
}else if(nums[mid]>mid){
//如果大于位数,说明缺失的位在左边,也有可能就是mid
right=mid-1;
}
//发现的规律:只要是确定数组某种边界的,就可以用这种方法来找到边界的位置,最后,right指向左边,left指向右边。
}
//left对应的就是位数与数字不相等的第一个数字,减去1即为所求
//right在left左边一个,是相等的最后一个数字。
if(left<nums.length){
return --nums[left];
}else{
return ++nums[right];
}
//别忘了考虑一下越界的情况。
}
}