给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n)
的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5 输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2 输出: 1
示例 3:
输入: nums = [1,3,5,6], target = 7 输出: 4
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
为 无重复元素 的 升序 排列数组-104 <= target <= 104
思路:如果题目没有限制时间复杂度的话,那么用for循环可以很简单的实现,由于该题目需要的时间复杂度为O(log n)
所以这里使用二分查找,二分查找分别有递归和迭代两种方式,这里使用迭代来实现
二分查找的核心变量有三个:left指针、right指针和mid(middle)指针,每次将target与数组中间项(Arr[mid])作比较,target大于Arr[mid],将left指针右移至mid位置,重新计算mid指针位置target小于Arr[mid],将right指针左移至mid位置,重新计算mid指针位置
mid=Math.floor(left+(right-left)/2)
下面附上实现代码
/*** @param {number[]} nums* @param {number} target* @return {number}*/
var searchInsert = function (nums, target) {let left = 0let right = nums.length - 1while (left <= right) {let mid = Math.floor(left + (right - left) / 2);if (target == nums[mid]) {return mid}else if (target < nums[mid]) {right = mid - 1} else {left = mid + 1}}return right + 1
};