搜索插入位置
给定一个排序好的数组和一个目标值,若数组中找到目标值,并返回其索引,若数组中找不到该目标值,则**返回按顺序插入的位置的索引**
思路:二分查找-【有序数组中查找特定元素】
初始化两个指针:left(指向数组的起始位置)和 right(指向数组的结束位置)。
进入循环:当 left <= right 时继续执行循环。
计算中间点:找到当前查找范围的中间点 mid = Math.floor((left + right) / 2)。
比较中间点与目标值:
如果 nums[mid] == target,则找到了目标值,直接返回 mid。
如果 nums[mid] < target,说明目标值只可能在右半部分,因此调整 left = mid + 1。
如果 nums[mid] > target,说明目标值只可能在左半部分,因此调整 right = mid - 1。
跳出循环:如果循环结束后仍未找到目标值,则跳出循环。
值得注意的是:为什么跳出循环后返回 left
- 在每一次迭代中,left 和 right 都是在尝试逼近目标值应该所在的位置。
- 当 left 超过 right 时(即 left > right),表示搜索空间已经完全检查完毕。此时,left 实际上指向了第一个大于目标值的元素的位置,而 right 则指向最后一个小于目标值的元素的位置。
- 因此,无论目标值是否存在于数组中,left 的位置都是目标值按顺序应该插入的位置。这是因为,经过一系列的二分操作后,所有 nums[left] 前面的元素都小于目标值,而从 left 开始及其后的元素都不小于目标值。
下面举个例子:
function searchInsert(nums,target){
let left = 0
let right = nums.length - 1
// 初始化mid
let mid = Math.floor((left + right)/2)
while(left <= right){
if(target === nums[mid]){
return mid
}else if(target > nums[mid]){
left = mid + 1
}else{
right = mid - 1
}
}
return left
}