二分查找的边界问题

二分查找在有序数组中是一个非常低成本的查找方法,但是不对二分查找十分的熟悉很难对不同的需求快速写出不同的边界判断和边界返回。

1.二分查找中的下中位数

median = (length - 1) / 2

2.模板分析

由于需求前变万化,我个人推荐固定(l<r)的判别。
而对于l指针和r指针的理解:

对于搜索过程中, high 位置的作用是减少搜索空间而 low 的作用是从0开始一直向着目标数字前进

搜索到的时候返回它,是一个一直逼近的过程。

对此对于高位的操作就可以放心惹

对于变种的题,只需找到目标位置与left位置关系即可。

那么对于不同的需求,只要在return中进行不同的判断即可。
以下代码的区别仅仅是=的位置不同

function upperInsert(target){
    let l=0;
    let r=stones.length-1;
    while(l<r){
        let m=Math.floor((l+r)/2);
        if(target<stones[m]){
            r=m;
        }else if(target>=stones[m]){
            l=m+1;
        }
    }
    return target>stones[l]?l+1:l;;
    //关键,相等或者大于都推进l,最后的判断是为了将结果插到末位(因为超过r了)
}

function lowerInsert(arr,target){
    let l=0;
    let r=arr.length-1;
    while(l<r){
        let m=Math.floor((l+r)/2); 
        if(target<=arr[m]){
            r=m; 
        }else if(target>arr[m]){
            l=m+1;
        }
    }
    //if(nums[l]!=target) return -1;
    //判断原数组中没有target的情况,不判断也行,就是返回插入位置
    return target>arr[l]?l+1:l;;
    //同样插入到最末尾要判断超r的情况
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值