题目描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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
示例 4:
输入: nums = [1,3,5,6], target = 0
输出: 0
示例 5:
输入: nums = [1], target = 0
输出: 0
提示:
- 1 <= nums.length <= 104
- -104 <= nums[i] <= 104
- nums 为无重复元素的升序排列数组
- -104 <= target <= 104
解题思路
- 二分算法
- 设置一个head指针,tail指针,mid指针
- 当tail指针减去head指针大于3的时候,用二分算法查找,小于3的时候用顺序查找
- 在二分查找内,mid的值为tail加上head除以2
- 当nums[mid]大于等于目标值时,tail就等于mid,否者head = mid + 1
- 在顺序查找中,当nums[i]大于等于目标值时,返回当前的i,最后否者返回num的长度,也就是在数组中没有找到比目标值小的,所以把目标值放在最后
代码
var searchInsert = function(nums, target) {
let head = 0, tail = nums.length - 1, mid;
while (tail - head > 3) {
mid = (tail + head) >> 1;
if(nums[mid] >= target) tail = mid;
else head = mid + 1
}
for (let i = head; i <= tail; i++) {
if(nums[i] >= target) return i;
}
return nums.length;
};