题目名称

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

请必须使用时间复杂度为 O(log n) 的算法。

示例

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

题解

主要使用二分法
首先判断两端临界值是否满足

接下来通过使用二分法,来进一步锁定元素插入位置

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function(nums, target) {
if(nums[0] > target) return 0
if(nums[nums.length - 1] < target) return nums.length
let left = 0, right = nums.length - 1, half = nums.length >> 1
while(left < right) {
if(nums[half] < target) {
left = half + 1
} else if(nums[half] === target) {
return half
} else {
right = half - 1
}
half = (left + right) >> 1
}
return nums[half] < target ? half + 1 : half
};