力扣刷题记录 剑指 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
题目解释
- 数组中的值是按递增序列排放的且不会有重复的出现。
- 数组中的值只会是 0 ~ n-1 中的一个,即当长度为1时,值只会是0和1;长度为2时,只会出现0,1,2。
解题思路
1. 循环数组,找出该数组不存在的那位。
/**
* @param {number[]} nums
* @return {number}
*/
var missingNumber = function(nums) {
let temp = 1; // 标志位,标志不存在的数字是否是最后一位
// 循环,如果找到直接返回
for(let i = 0; i < nums.length; i++) {
if(nums[i] != i) {
temp = 0;
return i;
}
}
if(temp == 1) {
return nums[nums.length - 1] + 1;
}
};
2. 二分法查找(重点理解!!!)
/**
* @param {number[]} nums
* @return {number}
*/
var missingNumber = function (nums) {
let left = 0;
let right = nums.length - 1;
while(left <= right) {
let mid = Math.floor((left + right) / 2);
if(mid == nums[mid]) {
// 缺失的在右边
left = mid + 1;
} else {
// 缺失的在左边
right = mid - 1;
}
}
return left;
};
总结
- js中向下取整的方式:Math.floor();
- 二分法的使用:排序数组的搜索问题,首先想到用二分法。时间复杂度0(log2n)