二分法总结

下面三种采用了左右都闭合的数组的形式

void binaryS(int a[],int l,int r,int x) //经典做法,适合寻找数组中需要找的值的所在位置
{
    while(l<=r)  //等l大于r的时候可以判断这个数组是找不到x的情况
    {
        int mid = (l+r)/2;
        if(a[mid] == x)
   			return mid;
        else if(sum < m)
            l = mid + 1;
        else if(sum > m)
            r = mid - 1;
    }
    return -1; //查找失败
}

int upper_bound(int left,int right,int x) //寻找第一个大于寻找值的位置
{
    int l=left,r = right;
    while(l<r)  //因为不需要找特定的数值,而是第一个大于x的数字,即使x不存在,也只需要找到假设它存在的时候它应该在的位置,即是l==r的时候。
    {
        int mid = (l+r)/2;
        if(dim[mid] <= x)
            l = mid + 1;
        else if(dim[mid] > x)
            r = mid;
    }
    return l;
}

int lower_bound(int left,int right,int x) //寻找第一个大于等于寻找值的位置
{
    int l=left,r = right;
    while(l<r)
    {
        int mid = (l+r)/2;
        if(dim[mid] <= x)
            l = mid + 1;
        else if(dim[mid] > x)
            r = mid;
    }
    return l;
}

左开右闭的情况
int lower_bound(int left,int right,int x) //寻找第一个大于等于寻找值的位置
{
    int l=left,r = right;
    while(l + 1<r) //当l+1 == r的时候意味着唯一位置
    {
        int mid = (l+r)/2;
        if(dim[mid] <= x)
            l = mid;
        else if(dim[mid] > x)
            r = mid;
    }
    return l;
}


发布了111 篇原创文章 · 获赞 4 · 访问量 3197

猜你喜欢

转载自blog.csdn.net/qq_15556537/article/details/104070319
今日推荐