题目描述:
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
思路分析:
可以考虑用二分法来解决问题:令mid = (left + right) / 2;
- 当中间元素等于mid = nums[mid]时,说明缺失的数字在后面,令 left = mid + 1;
- 当中间元素等于mid != nums[mid]时,说明缺失的数字在前面;令 right= mid - 1;
- 最后返回left。
参考代码:
public int missingNumber(int[] nums) {
if(nums == null || nums.length == 0)return -1;
int left = 0;
int right = nums.length - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] == mid)left = mid + 1;
else right = mid - 1;
}
return left;
}
小结:
最后为什么返回的是left?
当left == right时:
- nums[mid] == mid; left = mid + 1;left > right;说明left左边的数字都不缺,缺失的在后面,那么就返回越界的下标left即可;
- nums[mid] != mid; right = mid - 1;left >right;说明缺失的数字在左边,而在当前区间下左边已经没有数字了,此时left比mid小,left就是缺失的数字,返回left即可。