剑指offer-0~n-1中缺失的数字

Posted by franki on May 15, 2021

0~n-1中缺失的数字

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

示例

输入: [0,1,3]
输出: 2

思路

二分查找,当中间值与中间值在其所在的下标值说明缺失的数字在右边,当中间值与其所在的下标值不等时,继续看mid-1与其下标值是否相等,如果相等说明,mid就是所求,否则缺失的数字在左边

代码

/**
 * @param {number[]} nums
 * @return {number}
 */
var missingNumber = function(nums) {
    let start = 0, end = nums.length-1;
    while (start <= end) {
        const mid = (start + end) >> 1;
        if (mid === nums[mid]) {
            start = mid+1;
        } else {
            if (mid === 0 || mid-1 === nums[mid - 1]) {
                return mid;
            } else {
                end = mid - 1;
            }
        }
    }

    if (start === nums.length) {
        return nums.length;
    }

    return -1;
};

复杂度分析:

  • 时间复杂度: O(log(N))
  • 空间复杂度:O(1)