题目
- 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内。在范围0-n-1内的n-1个数字有且只有一个数字不在该数组中,请找出这个数字。
- leetcode链接:https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof/submissions/
思路
- 遍历法。将0 到 n-1进行求和,然后减去数组的数,剩下的就是那个缺失的数,时间复杂度是O(n),显然没有利用递增排序这一特点
- 看到递增排序,第一时间就要想到用二分查找法,提高效率,如果midItem等于下标,则表明缺失的数在mid的右边,如果不等于下标,则表示在左边,注意边界条件单独处理会比较好。
代码
/**
* @param {number[]} nums
* @return {number}
*/
var missingNumber = function(nums) {
let left = 0
let right = nums.length - 1
while (left <= right) {
const mid = Math.floor((left + right) / 2)
if (nums[mid] === mid) {
left = mid + 1
} else if (nums[mid] > mid) {
right = mid - 1
}
}
return left
};