给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n)
的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5 输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2 输出: 1
力扣https://leetcode.cn/problems/search-insert-position/description/?envType=study-plan&id=suan-fa-ru-men&plan=algorithms&plan_progress=ya6j5ke
解题:二分法,左闭右闭
情况一:middle >target && middle-1 <target ,那么就是我们要找的位置,直接return middle
情况二:middle >target && middle-1>=target,那么循环继续,查找左区间
情况三: middle <target && middle+1 >target ,那么就是我们要找的位置,直接return middle+1
情况四: middle <target && middle+1 <=target ,那么循环继续,查找右区间
除此之外,就是只有middle = target了,直接返回middle
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function(nums, target) {
let left = 0
let right = nums.length-1
if(target > nums[right]){
return nums.length
}
while(right >=left){
let middle =Math.floor(left +(right-left)/2)
if(nums[middle]>target && nums[middle-1]<target){
return middle
}
else if (nums[middle]>target && nums[middle-1]>=target){
right = middle -1
}
else if (nums[middle]<target && nums[middle+1]>target){
return middle+1
}
else if (nums[middle]<target && nums[middle+1]<=target){
left = middle +1
}
else return middle
}
};