二分查找思想

1.基本框架

function binarySearch(array,target) {
    let left = 0;
    ler right = ...

    while(...){
        let mid = left + (right - left)/2;
        if(array[mid] == target) {
            ...
        }
        else if(array[mid] < target) {
            left = ...
        }
        else if(array[mid] > target) {
            right = ...
        }
    }
    return ...;
}

2.寻找单个数的下标

function binarySearchSingle(array,target) {
    let left = 0;                       // 闭区间
    let right = array.length - 1;       // 闭区间

    while(left <= right) {              // 闭区间
        let mid = left + parseInt((right - left)/2);
        if(array[mid] == target) {
            return mid;                 // 闭区间        
        }
        else if(array[mid] < target) {
            left = mid + 1;             // 闭区间
        }
        else if(array[mid] > target) {
            right = mid - 1;            // 闭区间
        }
    }
    return -1;
}

3.寻找数出现的左区间边界

function binarySearchLeftZone(array,target){
    let left = 0;                       // 闭区间
    let right = array.length;           // 开区间

    while(left < right) {               // 开区间
        let mid = left + parseInt((right - left)/2);
        if(array[mid] == target) {
            // 这里的高妙之处是在寻找到值后,去掉右区间,不断寻找左区间的边界值。
            right = mid;                // 开区间 与上面的right一致 
        }
        else if(array[mid] < target) {
            left = mid + 1;             // 闭区间
        }
        else if(array[mid] > target) {
            right = mid;                // 开区间 与上面的right一致 
        }
    }
    return array[left] == target ? left : -1;  
}

4.寻找数出现的右区间边界

function binarySearchRightZone(array,target){
    let left = 0;                       // 闭区间
    let right = array.length;           // 开区间

    while(left < right) {               // 开区间
        let mid = left + parseInt((right - left)/2);
        if(array[mid] == target) {
            // 这里的高妙之处是在寻找到值后,去掉左区间,不断寻找右区间的边界值。
            left = mid + 1;             // 闭区间 与上面的left一致 
        }
        else if(array[mid] < target) {
            left = mid + 1;             // 开区间
        }
        else if(array[mid] > target) {
            right = mid;                // 开区间
        }
    }
    return array[right-1] == target ? right-1 : -1;  
}

5.总结

写完二分的框架之后

确定左右边根据定义的left和right来确定闭区间跟开区间。

6.参考

https://www.cnblogs.com/kyoner/p/11080078.html

 

posted @ 2020-06-27 16:08  正义de键盘侠  阅读(142)  评论(0)    收藏  举报