二分查找

常规的二分搜索

1 while (l <= r) {
2  int mid = (l + r) / 2;
3  if (f[mid] == x)return mid;
4  if (f[mid] > x) l = mid + 1;
5    else r = mid - 1;
6 }

 

 查找小于等于x的第一个数

int GetLastValueLessThan(int v, vector<int>& svec)
{
    int low = 0, high = svec.size() - 1;
    while( low <= high )
    {
    int mid = (low + high) >> 1;
    /* 如果要求查找严格小于x的第一个数,将改为svec[mid] >= v*/
    if( svec[mid] > v )
        high = mid - 1;
    else low = mid + 1;
    }
    return svec[high];
}

 

查找大于等于x的第一个数

int GetFirstValueGreaterThan(int v, vector<int>& svec)
{
    int low = 0, high = svec.size() - 1;
    while( low <= high )
    {
    int mid = (low + high) >> 1;
    /* 如果要求查找严格大于x的最后一个数,将改为svec[mid] > v*/
    if( svec[mid] >= v )
        high = mid - 1;
    else low = mid + 1;
    }
    return svec[low];
}

 

posted @ 2020-12-11 21:33  大W  阅读(69)  评论(0)    收藏  举报