【leetcode】35.搜索插入位置js

题目

代码

升序+O(logn)一秒想到二分查找。

javascript 复制代码
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var searchInsert = function(nums, target) {
    let left = 0, right = nums.length - 1
    while (left <= right) {
        let mid = Math.floor((left + right) / 2)
        if (nums[mid] === target) {
            return mid
        } else if (nums[mid] < target) {
            left = mid + 1
        } else {
            right = mid - 1
        }
    }
    return left
};

1.要注意边界的问题。

最开始写的循环条件是left < right,但这样对于最大的要插入数组末尾的数就不行了,边界会丢失。改为left <= right问题就解决了。

示例 1:nums=[1,3,5,6], target=7

  • 正确插入位置应为 4(末尾)。

  • 原代码:

    left=0, right=3 → mid=1 (3<7) → left=2

    left=2, right=3 → mid=2 (5<7) → left=3

    left=3, right=3 → 循环结束,返回 3

示例 2:nums=[1,3,5,6], target=2

  • 正确插入位置应为 1

  • 原代码:

    left=0, right=3 → mid=1 (3>2) → right=0

    left=0, right=0 → 循环结束,返回 0

示例 3:nums=[1], target=2

  • 正确插入位置应为 1

  • 原代码:

    left=0,right=0,循环不执行,返回 0

2.为什么返回 left

循环结束时 left > right,且 left 指向第一个大于 target 的元素的位置(如果 target 大于所有元素,则 left = nums.length)。