码迷,mamicode.com
首页 > 其他好文 > 详细

各种类型的二分模板

时间:2017-11-18 13:44:23      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:大于   一个   upper   lap   one   turn   microsoft   种类   存在   

1、查找最后一个小于或者等于key的下标,若不存在,则返回-1 ==> 同lower_bound(arr+1, arr+1+n, key)

技术分享图片
int BinSearch(int a[], int n, int key)
{
    int m, l = 0, r = n - 1;//闭区间[0, n - 1]
    while (l <= r)
    {
        m = (l+r)/2;
        if (a[m] <= key) l = m + 1;
        else if(a[m] > key) r = m - 1;
    }
    if(l == 0) return -1;//not find
    return l-1;
}
View Code

 

2、查找第一个大于或者等于key的下标,若不存在,则返回-1

技术分享图片
int BinSearch(int a[], int n, int key)
{
    int m, l = 0, r = n - 1;//闭区间[0, n - 1]
    while (l <= r)
    {
        m = (l+r)/2;
        if (a[m] < key) l = m + 1;
        else if(a[m] >= key) r = m - 1;
    }
    if(r == n-1) return -1;//not find
    return r+1;
}
View Code

 

3、查找第一个与key相等的下标,若不存在,则返回-1

技术分享图片
int BinSearch(int a[], int n, int key)
{
    int m, l = 0, r = n - 1;//闭区间[0, n - 1]
    while (l < r)
    {
        m = l + ((r - l) >> 1);//向下取整
        if (a[m] < key) l = m + 1;
        else r = m;
    }
    if (a[r] == key) return r;
    return -1;
}
View Code

 

4、查找最后一个与key相等的小标,若不存在,则返回-1

技术分享图片
int BinSearch(int a[], int n, int key)
{
    int m, l = 0, r = n - 1;//闭区间[0, n - 1]
    while (l < r)
    {
        m = l + ((r + 1 - l) >> 1);//向上取整
        if (a[m] <= key) l = m;
        else r = m - 1;
    }
    if (a[l] == key) return l;
    return -1;
}
View Code

 

5、查找第一个大于key的下标,若不存在,则返回-1 ==> 同upper_bound(arr+1, arr+n+1, key)

技术分享图片
int BinSearch(int a[], int n, int key)
{
    int m, l = 0, r = n - 1;//闭区间[0, n - 1]
    while (l < r)
    {
        m = l + ((r - l) >> 1);//向下取整
        if (a[m] <= key) l = m + 1;
        else r = m;
    }
    if (a[r] > key) return r;
    return -1;
}
View Code

 

6、查找最后一个小于key的下标,若不存在,则返回-1

技术分享图片
int BinSearch(int a[], int n, int key)
{
    int m, l = 0, r = n - 1;//闭区间[0, n - 1]
    while (l < r)
    {
        m = l + ((r + 1 - l) >> 1);//向上取整
        if (a[m] < key) l = m;
        else r = m - 1;
    }
    if (a[l] < key) return l;
    return -1;
}
View Code

 

各种类型的二分模板

标签:大于   一个   upper   lap   one   turn   microsoft   种类   存在   

原文地址:http://www.cnblogs.com/Rubbishes/p/7856400.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!