学习笔记:剑指 Offer 53 - II. 0~n-1中缺失的数字

127 阅读1分钟

题目描述

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

题目示例一

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

题目示例二

输入: [0,1,2,3,4,5,6,7,9]
输出: 8

题目分析

由于是数据递增的,那就是有序的,有序的数据第一时间想到的就是用二分法来处理,根据数据的长度先找到中间的值的索引,如果中间的索引与其对应的值不相等,说明这个值前面的数据位置匹配不对,此时右侧边界应该是中间值减一,继续循环上面的逻辑。

代码实现一

/**
 * @param {number[]} nums
 * @return {number}
 */
var missingNumber = function(nums) {
    let left = 0, right = nums.length - 1;
    while(left < right) {
        let mid = left + right >>> 1;
        nums[mid] !== mid ? right = mid -1 : left = mid + 1
    }
    return left
}

代码实现二

/**
 * @param {number[]} nums
 * @return {number}
 */
 // 先根据数据的length求和,然后再遍历数据进行累加操作,总和 减去 (累加和)等于=> 缺失的值
var missingNumber = function(nums) {
    let total = ((0 + nums.length) * (nums.length + 1)) / 2;
    const sum = nums.reduce((current, val) => {
        return current + val
    })
    return total - sum
}

题目来源

LeetCode leetcode-cn.com/problems/qu…