题目:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
首先的想法,暴力法。直接查找是否有target,有就是这个位置,没有的话查找目前元素是否比target大,是的话就返回该位置。
时间复杂度O(N),空间复杂度O(1)。
var searchInsert = function(nums, target) {
for(let i=0;i<nums.length;i++){
if(nums[i] == target || nums[i]>target){
return i;
}
}
return nums.length;
};
之后,想到了可以用二分查找法,使用双指针法。判断中间的是否大于等于target,是的话就查找左边,右指针改为mid-1,并将ans 的位置为mid,否则就查找右边,将左指针改为mid+1。
时间复杂度O(logN),空间复杂度O(1)。
var searchInsert = function(nums, target) {
let left = 0;
let right = nums.length-1;
let ans = nums.length;
while(left<=right){
let mid = Math.floor((left+right)/2);
if(nums[mid] >= target){
ans = mid;
right = mid - 1;
} else{
left = mid + 1;
}
}
return ans;
};
本文为作者关于LeetCode的解法
大神解法请自行搜索