给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为
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)