快手算法训练-二分查找

136 阅读1分钟

一、二分查找

1、变体一:查找第一个值等于给定值的元素

var array=[1,3,4,5,6,8,8,8,11,18]
//console.log(1)
var search=function(array,value){
    var low=0
    var hight=array.length
    while(low<=hight){
       // console.log(middle)
        var middle=low+((hight-low)>>1)
        if(array[middle]>value){
            hight=middle-1
        }else if(array[middle]<value){
            low=middle+1
        }else{
            if(middle==0||array[middle-1]!==value){
                return middle
            } else{
                hight=middle-1
            }
        }
    }
    return -1
}

console.log(search(array,8))

2、变体三:查找第一个大于等于给定值的元素

var array=[1,3,4,5,6,8,8,8,11,18]
//console.log(1)
var search=function(array,value){
    var low=0
    var hight=array.length
    while(low<=hight){
       // console.log(middle)
        var middle=low+((hight-low)>>1)
       if(array[middle]>=value){
           if(middle==0||array[middle-1]<value){
               return middle
           }else{
               hight=middle-1
           }
       }else{
           low=middle+1
       }
    }
    return -1
}

console.log(search(array,9))

3、变体四:查找最后一个小于等于给定值的元素

var array=[1,3,4,5,6,8,8,8,11,18]
//console.log(1)
var search=function(array,value){
    var low=0
    var hight=array.length
    while(low<=hight){
       // console.log(middle)
        var middle=low+((hight-low)>>1)
       if(array[middle]<=value){
           if(middle==array.length-1||array[middle+1]>value){
               return middle
           }else{
               low=middle+1
           }
       }else{
           hight=middle-1
       }
    }
    return -1
}

console.log(search(array,9))