给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例1
输入: nums = [1,3,5,6], target = 5
输出: 2
示例1
输入: nums = [1,3,5,6], target = 2
输出: 1
题解
二分法
题目中说排序数组找到目标值,这里给出两个信息:数组有序和目标值(唯一);并且要求使用时间复杂度为 O(log n) 的算法。提示很明显利用二分法查找目标值。
对于任意区间:当有成立 index 即为目标值插入的位置。
套路二分法,假设数组长度为lenght,二分法模版代码如下
let left = 0;
let right = length
while(left < right){
const mid = Math.floor(left +( right - left) / 2 );
if(mid === target) return mid;
if(mid < target) {
left = mid+1;
}else{
right = mid - 1;
}
}
稍微修改一下,因为目标值可能大于当前数组所有元素,此时target需要插入数组长度的位置
代码
var searchInsert = function(nums, target) {
let len = nums.length;
let left = 0;
let right = len-1;
while(left <= right){
const mid = Math.floor(left +( right - left) / 2 );
if(nums[mid] === target) return mid;
if(nums[mid] < target) {
left = mid+1;
}else{
right = mid - 1;
}
}
return left
};