给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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-1if(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}
};