剑指 Offer 53 - II. 0~n-1中缺失的数字

剑指 Offer 53 - II. 0~n-1中缺失的数字 这个题当然可以用遍历的方法,但是我们只要看到递增排序数组,就应该想到用二分法去做。但是这个题跟其它的二分法不是很一样,它没有明确要查找的target 或者左边界,右边界等,而是数组的中间有一个断点。我们可以根据这个断点把数组分为两部分:左数组和右数组,然后我们可以发现,左数组的所有元素的值都和他们的索引相同,而右数组则不是

  因此,我们可以用 值是否与索引相同这一点来判断是左数组还是右数组。而根据题目要求,我们需要返回右数组的第一个元素的索引,它就是缺失的元素

剑指 Offer 53 - II. 0~n-1中缺失的数字    那么,我们使用二分查找,最终 left 应该对应的 右数组的第一个元素,而 right 应该对应左数组的最后一个元素,即 left == right + 1时退出。

class Solution {
    public int missingNumber(int[] nums) {
        //尝试二分法
        int left = 0,right = nums.length-1,mid;
        //可以跟索引进行对应
        while(left<=right){ //当 left == right+1 时退出
            mid = left + (right - left)/2;
            if(nums[mid]==mid){
                //mid在左数组,右数组第一个元素在[mid+1,right]上
                left = mid + 1;
            }else{
                //mid在右数组,左数组的最后一个元素在[left,mid-1]上
                right = mid - 1;
            }
            //不存在 nums[mid]>mid的情况
        }
        return left; //left对应 右数组的第一个元素
    }
}

 

上一篇:122. 买卖股票的最佳时机 II


下一篇:二叉搜索树中最接近的值 II——lintcode901