剑指Offer_#53

剑指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作为定位结果。这样一来,如果缺失的数字是最后一个,也能得到正确结果,而不需要做任何特殊的处理。

解答

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;
    }
}
原文地址:https://www.cnblogs.com/Howfars/p/13355362.html