lower_bound 和 upper_bound 的实现

lower_bound()返回的是要查找的数的最小下标,upper_bound()则返回的是最大下标
两者都是用二分查找,需要先排序。两者相减得到的则是一共有多少个要查找的数的个数减一

#include 
#include 

using namespace std;
const int MAXN = 1000;

int n, k;
int a[MAXN];
int lower_bound()
{
    int lb = -1;
    int rb = n;
    bool flag = false;  // 判断是否找到了这个数
    while(rb - lb > 1)  // 直到解的范围不大于1
    {
        int mid = (lb + rb) / 2;
        if(!flag && a[mid] == k)
            flag = true;
        if(a[mid] >= k)
            rb = mid;
        else
            lb = mid;
    }
    if(flag)
        return rb;
    else
        return -1; 
}
int upper_bound()
{
    int lb = -1;
    int rb = n;
    bool flag = false;
    while(rb - lb > 1)
    {
        int mid = (lb + rb) / 2;
        if( !flag && a[mid] == k)
            flag = true;
        if(a[mid] <= k)
            lb = mid;
        else
            rb = mid;
    }
    if(flag)
        return lb;
    else
        return -1;
}

int main()
{
    scanf("%d %d", &n, &k);
    for(int i=0; i

 

你可能感兴趣的:(二分和尺取,STL)