题目描述
一个长度为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…