剑指 Offer 53 - II. 0~n-1中缺失的数字
题目描述
一个长度为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
思路
误区
直接二分法查找,找出: 数组元素!===元素索引值 直接返回
开始时理解错了,过了测试点以为是正确的解法,结果一提交就直接GG
重新看清楚题目之后发现
如果数组出现以下情况:
数组:[0]
输入:[0]
输出:1
数组:[1]
输入:[1]
输出: 0
数组:[0,2,3]
输入:[0,2,3]
输出:1
这几种情况是典型代表,直接可以推翻之前的想法
正确解法
由于数组是递增排序的,所以使用二分法查找较快,将数组的值与元素的索引值进行比较,出现两种情况:
- 数组值 === 元素的索引:目标值在mid的右边
- 数组值 !== 元素的索引 :目标值在mid 的左边
代码
/**
* @param {number[]} nums
* @return {number}
*/
var missingNumber = function(nums) {
let left = 0;
let n = nums.length;
let right = n-1;
while(left <= right){
let mid = Math.floor((left+right)/2);
if(mid === nums[mid]){
left = mid + 1;
}
else{
right = mid - 1;
}
}
return left;
};