二分查找到第一个大于等于num的位置

// 二分查找, 找到第一个大于等于num的位置 (数组必须从小到大排好序,且不重复)

// 二分查找, 找到第一个大于等于num的位置 (数组必须从小到大排好序,且不重复)
Array.prototype.binarySearchLe = function(num){
    let res = -1;
    for(let q=0,p=this.length-1; q <= p; ){
        const i = Math.floor((p+q)/2);
        if(this[i] == num) { // 返回
            // res = i; break;
            return i;
        } else {
            if(this[i] < num){ // 向后找
                q = i+1;
            } else { // 向前找
                res = i;
                p = i-1;
            }
        }
    }
    return res;
}

20210330 增强功能,参数不仅可以是数字,还可以是函数

// 二分查找, 找到第一个大于等于num的位置 (数组必须从小到大排好序,且不重复)
//   如果参数是函数,比如 fn(x){ return x-num; } 这个是比较函数,
//     x==num返回0,x>num返回正数, x<num返回负数
// 一个例子:[{a:1},{a:2},{a:3}].binarySearchLe((x)=>x.a-2) // 返回位置 1
Array.prototype.binarySearchLe = function(numOrFn){
    const isFn = typeof numOrFn === "function"; // 判断参数是函数还是数字
    let res = -1;
    for(let q=0,p=this.length-1; q <= p; ){
        const i = Math.floor((p+q)/2);
        // this[i] 和 numOrFn 比较的结果
        const cmp = isFn? numOrFn(this[i]) : this[i]-numOrFn;
        if(cmp === 0) { // 返回
            return res = i;
        } else {
            if(cmp < 0){ // i比num小, 向后找
                q = i+1;
            } else { // 向前找
                res = i;
                p = i-1;
            }
        }
    }
    return res;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值