题目描述:
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0到n-1之内。在范围0到n-1的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
样例:
输入:[0,1,2,4]
输出:3
分析:
长度为n-1的数组,数字范围在0到n-1,即n个数字存放到长度为n-1的数组中,那么肯定有一个元素不在数组中(当所有数字只出现一次的情况下)。
- 首先考虑特殊情况当数组长度为0时返回0;
当数组中第一个元素不等于0时,那么缺失的肯定是0;
当数组长度等于1时,如果第一个元素为0,那么缺失的肯定是1。 - 然后利用二分查找处理一般情况,
每次比较中间位置mid是否和中间元素nums[mid]匹配。
如果下标和对应元素相等:
- 当下标等于最后一个位置时,则缺失的元素为n-1;
- 当下标不等于最后一个位置时,则令low=mid+1,证明mid之前的元素都没有缺失,继续检测mid之后的元素;
如果下标小于对应的元素:
- 如果下标等于0,则缺失元素为0;
- 如果mid-1的位置的元素和相应下标匹配,那么缺失的元素为mid;
- 否则令high=mid-1,证明缺失的元素一定在mid左侧
public int getMissingNumber(int[] nums) {
//数组长度为n-1一共n个数字,那么肯定有一个不再数组中
if(nums==null||nums.length==0)
return 0;
if(nums[0]>0)
return 0;
if(nums.length==1)
return nums[0]+1;
int low=0,high=nums.length-1;
while(low<high) {
int mid=low+(high-low)/2;
if(mid<nums[mid]) {
if(mid-1==nums[mid-1])
return mid;
if(mid==0)
return mid;
high=mid-1;
}
else if(mid==nums[mid]) {
if(mid==nums.length-1)
return mid+1;
low=mid+1;
}
}
if(low!=nums[low])
return nums[low]-1;
return low+1;
}