二分查找

171 阅读1分钟

题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

思路一:

找到大于等于目标值的元素,返回下标

时间复杂度:遍历整个数组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; 
};