对二分的重新认识

说到二分,首先想到二分查找,这个我一般都是这样写的:

//在长度为n的数组a[]里找到gold并返回下标,若不存在返回-1
int BinarySearch(int n, int a[], int gold)
{
    int L = 0, R = n-1;
    while(L < R)
    {
        int mid = (L+R)/2;
        if(a[mid] < gold)
            L = mid;
        else if(a[mid] > gold)
            R = mid;
        else
            return mid;
    }
    return -1;
}

然后在实际用到的时候基本都会发现会陷入死循环,于是我一般都会把while(L < R)改成while(L < R-1),然后还要提前判断一下初始L,R是不是满足条件,然后balabala的,总之就是以上面那段代码为模板瞎改改,但R=mid和L=mid,以及那个while里面的<是固定的。以前这样都是可以糊弄过去,直到这两天做一个题,用到二分,但稍微有点复杂,问了一下队友才知道,二分赋值时并不是R=mid,L=mid,而一般都是R=mid-1,L=mid+1,然后我才知道我一直用的二分都是有问题的~

后来发现,这样会漏掉一些数,然后队友说他也不清楚,对于不同的题有时候也是瞎改改——和我差不多的那种。然后我仔细想了想,发现while里面要写成L<=R,这样就完美了~

即:

//在长度为n的数组a[]里找到gold并返回下标,若不存在返回-1
int BinarySearch(int n, int a[], int gold)
{
    int L = 0, R = n-1;
    while(L <= R)
    {
        int mid = (L+R)/2;
        if(a[mid] < gold)
            L = mid+1;
        else if(a[mid] > gold)
            R = mid-1;
        else
            return mid;
    }
    return -1;
}

具体为啥,我懒地解释了,haha

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值