• lower_bound和upper_bound


    时间复杂度:O(logN)

    用法:在一个左闭右开(a,b] 的有序区间里进行二分查找,需要查找的值由第三个参数给出。 

    条件:使用这两个函数注意要有序

    对于upper_bound来说,返回的是被查序列中第一个大于查找值的指针,也就是返回指向 被查值 > 查找值 的最小指针,lower_bound则是返回的是被查序列中第一个大于等于查找值的指针,也就是返回指向 被查值 >= 查找值 的最小指针。

    不过除此之外,这两个函数还分别有一个重载函数,可以接受第四个参数。如果第四个参数传入greater<Type>(),其中Type改成对应类型,那么upper_bound则返回指向 被查值<查找值 的最小指针,lower_bound则返回指向 被查值 <= 查找值 的最小指针。 

    注意写成lower_bound(a, a+n, x)-a,是从0开始计数;(必须-数组首地址才能得到第一个>=x的数的下标)

     lower_bound(a+1, a+n+1, x)-a,是从1开始计数。

    注意:如果用上述两个函数三个参数的那种形式,记得左闭右开的区间要为非递减的顺序,

    如果给第四个参数传入greater<Type>(),则区间为非递增的顺序。

    #include <iostream>
    #include <algorithm>
    using namespace std;
    //返回一个非递减序列 [1,n] 中的第一个 >= x 的位置 
    int main()
    {
        int a[50];
        int n, x, ans;
        cin >> n >> x;
    
        for(int i=1; i<=n; i++)
        {
            cin >> a[i];
        }
        ans = lower_bound(a+1, a+n+1, x) - a;
        cout << ans << endl;
        return 0;
    }
    lower_bound 大于等于 》x的位置
    #include <iostream>
    #include <algorithm>
    using namespace std;
    //返回一个非递减序列 [1,n] 中的第一个 <= x 的位置
    int main()
    {
        int a[50];
        int n, x, ans;
        cin >> n >> x;
    
        for(int i=0; i<n; i++)
        {
            cin >> a[i];
        }
        ans = lower_bound(a, a+n, x, greater<int>()) - a;
        cout << ans << endl;
        return 0;
    }
    /*
    5 3
    5 4 3 2 1
    2
    */
    返回一个非递减序列 [1,n] 中的第一个 <= x 的位置

    #include <iostream>
    #include <algorithm>
    using namespace std;
    //返回一个非递减序列 [1,n] 中的第一个 > x 的位置
    int main()
    {
        int a[50];
        int n, x, ans;
        cin >> n >> x;
    
        for(int i=0; i<n; i++)
        {
            cin >> a[i];
        }
        ans = upper_bound(a, a+n, x) - a;
        cout << ans << endl;
        return 0;
    }
    /*
    5 3
    1 2 3 4 5
    3
    */
    upper_bound返回一个非递减序列 [1,n] 中的第一个 > x 的位置
    #include <iostream>
    #include <algorithm>
    using namespace std;
    //返回一个非递减序列 [1,n] 中的第一个 < x 的位置
    int main()
    {
        int a[50];
        int n, x, ans;
        cin >> n >> x;
    
        for(int i=0; i<n; i++)
        {
            cin >> a[i];
        }
        ans = upper_bound(a, a+n, x, greater<int>()) - a;
        cout << ans << endl;
        return 0;
    }
    /*
    5 3
    5 4 3 2 1
    3
    */
    返回一个非递减序列 [1,n] 中的第一个 < x 的位置

    当一个序列里面某个数多次出现:

    upper_bound(a,a+n,x)  - lower_bound(a,a+n,x) 得到的是值为x的个数

    if(x==2)  1 2 2 2 3 ——> upper_bound(a,a+n,x)  - lower_bound(a,a+n,x)  =  3

    #include <iostream>
    #include <algorithm>
    using namespace std;
    //返回一个非递减序列 [1,n] 中的第一个 <= x 的位置
    int main()
    {
        int a[50];
        int n, x, ans = 0;
        cin >> n >> x;
    
        for(int i=0; i<n; i++)
        {
            cin >> a[i];
        }
        ans += upper_bound(a, a+n, x) - lower_bound(a, a+n, x) ;
        cout << ans << endl;
        return 0;
    }
    /*
    5 2
    1 2 2 2 3
    3
    */
    挑战程序设计-P161
  • 相关阅读:
    获取当前页URL函数
    Windows下搭建PHP开发环境
    Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed,SSL报错
    微信接口随笔
    老毛桃安装系统,最正确的快速的思路和办法
    老毛桃制作U盘启动盘
    十进制与三十六机制 互转 PHP代码
    Linux环境下修改GIT的用户名和邮箱
    Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseEntityRef: expecting ';' in Entity,
    如何保证库存数量及时
  • 原文地址:https://www.cnblogs.com/Roni-i/p/8763886.html
Copyright © 2020-2023  润新知