元素查找
查找插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例:
输入: nums = [1,3,5,6], target = 5
输出: 2
示例:
输入: nums = [1,3,5,6], target = 2
输出: 1
方案A 二分查找
思路:
-
设置双指针
- left: 指向 nums 开头
- right: 指向 nums 结尾
-
当
left<=right
时,不断获取 middle 中间值-
如果中间值大于 target ,说明 target 插入位置在中间值左侧 right 左移
-
如果中间值小于 target ,说明 target 插入位置在中间值右侧 left 右移
-
如果中间值等于 target ,说明插入位置找到,返回 middle
-
-
最后返回 left (nums 没有 target 时的插入位置)
function searchInsert(nums,target){
let left=0;
let right=nums.length-1;
while(left<=right){
let middle=left+Math.floor((right-left)/2);
if(nums[middle]<target){
left=middle+1;
}else if(nums[middle]>target){
right=middle-1;
}else{
return middle
}
}
return left
}
const nums=[1,3,5,6];
const target=5;
console.log(searchInsert(nums,target));
性能分析:
时间复杂度:O(logn),其中 n 为数组的长度。二分查找所需的时间复杂度为 O(logn)。
空间复杂度:O(1)。我们只需要常数空间存放若干变量。