算法--二分查找

711 阅读1分钟

二分查找

条件:数组必须是有序数组

基础框架:

while(left<=right){
  const mid = Math.floor((right-left)/2)
  if(nums[mid]==target){
    return mid
  }else if (nums[mid]>target){
    right = mid-1
  }else if (nums[mid]<target){
    left = mid+1
  }

在实际问题中,我们可能会涉及到查找比目标target大的第一个数或比target小的第一个数,这时需要做稍微的调整来让二分法执行有意义的查找例如:

剑指 Offer 53 - I. 在排序数组中查找数字 I

var search = function(nums, target) {
    var leftinx
    var rightinx
    leftinx = binary(target,nums,true)
    rightinx = binary(target,nums,false)
    return rightinx-leftinx
}
var binary = function(target,nums,x){
    var n= nums.length;
    var left = 0
    var right = nums.length - 1
     while(left<=right){
        mid =Math.floor((left+right)/2)
        if(nums[mid]>target || (x&&nums[mid]>=target)){
            right = mid-1
            n=mid
        }else{
            left = mid+1
        }
    }
    return n;
}