63.搜索插入位置

48 阅读1分钟

题目链接

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

解法 二分查找

思路

这是一道经典的二分查找的题目,找到 target 合适的插入位置。就是小于等于 left 并且大于等于 right

在二分的时候,判定条件为 left <= right ,这样不会漏掉任何一个值,特别是当 left === right 时还能再比一次,保证不遗漏。

接下来就是二分的模板框架了如果大于等于 target 收缩右边界,否则收缩左边界。

代码

function searchInsert(nums: number[], target: number): number {
    let left = 0;
    let right = nums.length - 1;

    while (left <= right) {
        const index = Math.floor((left + right) / 2);
        if (nums[index] >= target) {
            right = index - 1;
        } else {
            left = index + 1;
        }
    }
    return left;
};

时空复杂度

时间复杂度:O(log n)

空间复杂度:O(1)