35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 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
答案
对撞指针
类似快速排序
时间复杂度为:logn
思路:
声明对撞指针
left/right
声明中位数 mid
根据二分法比较
target
,找到对应下标 mid- while 循环条件:
while (left <= right) {}
nums[mid]
比较target
- 找到对应下标
return mid
- 未找到
left = mid +1 / right = mid -1
- while 循环条件:
未找到返回下标 left
var searchInsert = function(nums, target) {
let left = 0; //左位:下标
let right = nums.length - 1; //右位:下标
let mid = 0; //中位:下标
while(left<=right){
//或:mid = (low + high) >> 1 表示:该数二进制向右移一位 如:1000 >> 1 = 100 = 4(10进制),小数点直接被抹去。
mid = parseInt((left + right) / 2);
if(nums[mid]==target){
return mid;
}else if(nums[mid]>target){
right = mid - 1;
}else if(nums[mid]<target){
left = mid + 1;
}
}
return left;
};
var nums = [1,3,5,6], target = 3
console.log(searchInsert(nums,target))
暴力(时间复杂度为 n)
var searchInsert = function(nums, target) {
let index
let sortIndex
for(let i=0;i<nums.length;i++){
const element = nums[i]
if(element === target){
index = i
}
if(nums[i] < target){
if(target < nums[i+1]){
sortIndex = i+1
}
}
}
return index > -1 ? index : sortIndex ? sortIndex : 0
};
var nums = [1,3,5,6], target = 3
console.log(searchInsert(nums,target))