搜索插入位置-思路:二分查找

87 阅读2分钟

搜索插入位置

给定一个排序好的数组和一个目标值,若数组中找到目标值,并返回其索引,若数组中找不到该目标值,则**返回按顺序插入的位置的索引**

思路:二分查找-【有序数组中查找特定元素】

初始化两个指针: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 开始及其后的元素都不小于目标值。

下面举个例子:

image.png

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
}