剑指Offer_#53 - II_0~n-1中缺失的数字
剑指Offer_#53 - II_0~n-1中缺失的数字
Contents
题目
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
示例 1:
输入: [0,1,3]
输出: 2
示例 2:
输入: [0,1,2,3,4,5,6,7,9]
输出: 8
限制:
1 <= 数组长度 <= 10000
思路分析
二分查找。
- 如果缺失的数字不是数组的第一个或者最后一个,那么比较好处理,可以直接在数组中定位到这个位置,然后将此位置的下标返回;
- 如果缺失的是第一个数字0,那么应该返回0;
- 如果缺失的是最后一个数字,应该返回
n-1
(这时已经超出下标范围,最后一个下标是n-2
)。所以如果我们用mid
作为返回值,对这种情况就无能为力,因为mid不会超出数组下标范围。- 这里的处理方法和上题剑指Offer_53 - I_在排序数组中查找数字 有些类似,为了寻找右边界,不使用
mid
作为定位的结果,而是使用左指针start
作为定位结果。这样一来,如果缺失的数字是最后一个,也能得到正确结果,而不需要做任何特殊的处理。
- 这里的处理方法和上题剑指Offer_53 - I_在排序数组中查找数字 有些类似,为了寻找右边界,不使用
解答
class Solution {
public int missingNumber(int[] nums) {
int start = 0;
int end = nums.length - 1;
while(start <= end){
int mid = start + (end - start) / 2;
if(nums[mid] == mid) start = mid + 1;
if(nums[mid] != mid) end = mid - 1;
}
//这样写的好处是考虑到了省略数字在头尾的情况
return start;
}
}