题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
思路一:
找到大于等于目标值的元素,返回下标
时间复杂度:遍历整个数组O(n)
var searchInsert = function(nums, target) {
for(let i=0;i<nums.length;i++){
if(target<=nums[i]){
return i
}
}
return nums.length
};
思路二:二分查找
时间复杂度O(logn)
什么是二分法查找
两人猜数字,A心里默想一个0-500的数字(假设是366),让B猜
- B第一次猜250,A说小了,所以确定数字在250-500
- B第二次猜375,A说大了,所以确定数字在375-500
- B第三次猜437,A说小了,所以确定数字在375-437
- ...
这样,每次去掉一半的值,就叫二分法查找。
二分法查找适用于有序数组查找值:查找数字在数组中的位置,有就返回下标,没有就返回-1
function binarySearch(arr,target){
var left = 0;
var right = arr.length-1;
var mid = Math.floor((left+right)/2)
while(left<=right){
if(arr[mid]==target){
return mid
}else if(arr[mid]<target){
left = mid +1
}else{
right = mid-1
}
}
return -1
}
本题目中,查找大于等于目标元素的第一个值:
const searchInsert = (nums, target) => {
let left = 0;
let right = nums.length - 1;
while (left <= right) {
const mid = (left + right) >>> 1;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] > target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return left;
};