题目描述 - 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
示例:
- 输入: nums = [1,3,5,6], target = 5,输出: 2
- 输入: nums = [1,3,5,6], target = 2,输出: 1
思路分析
有序数组, 查找元素所在位置, 使用二分法。
设定左右节点为数组两端,即 left = 0,right = 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
};