菜鸟前端刷算法第五天

49 阅读1分钟

题目描述 - 搜索插入位置

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

示例:

  • 输入: nums = [1,3,5,6], target = 5,输出: 2
  • 输入: nums = [1,3,5,6], target = 2,输出: 1

思路分析

有序数组, 查找元素所在位置, 使用二分法。 设定左右节点为数组两端,即 left = 0right = nums.length - 1,待查找区间为 [left, right]

取两个节点中心位置 mid,先比较中心位置值 nums[mid] 与目标值 target 的大小,分以下三种情况:

  • 如果中心位置值 nums[mid] 与目标值 target 相等,则当前中心位置为待插入数组的位置。
  • 如果中心位置值 nums[mid] 小于目标值 target,则将左节点设置为 mid + 1,然后继续在右区间 [mid + 1, right] 搜索。
  • 如果中心位置值 nums[mid] 大于目标值 target,则将右节点设置为 mid - 1,然后继续在左区间 [left, mid - 1] 搜索。

直到查找到目标值返回待插入数组的位置,或者等到 left > right 时停止查找,此时 left 所在位置就是待插入数组的位置。

代码实现:

/**
 * @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 - left) / 2)
        let midItem = nums[mid]
        // 恰好相等
        if(midItem == target) return mid
        // 在右边
        if(midItem < target) left = mid + 1
        // 在左边
        if(midItem > target) right = mid - 1
    }
    return left
};