zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    WMware下的Linux系统安装VMtools
    VMware虚拟机安装Ubuntu图文攻略
    Python高级编程(三)
    Python高级编程(二)
    Python高级编程(一)
    纯div+css样式弹出泡泡消息框
    EF应用CodeFirst模式,数据迁移的基本用法要点摘记
    sql左连接的误区
    ExtJs,从开始接触到如今,我都觉得你好垃圾阿。。。。
    EntityFramework经典的left join语法
  • 原文地址:https://www.cnblogs.com/Roni-i/p/8763886.html
Copyright © 2011-2022 走看看