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
  • 相关阅读:
    数据结构与算法题目集(中文)6-12 二叉搜索树的操作集 (30分)
    性能测试案例
    jmeter 常用监听器
    性能测试面试题
    jmeter 之 dubbo
    jmeter5 分布式测试,未成功
    jmeter之OPMS项目管理参数化与断言实战;
    jmeter时间戳处理相关
    jmeter控制器下遍历一组参数
    The Wall (medium)
  • 原文地址:https://www.cnblogs.com/Roni-i/p/8763886.html
Copyright © 2011-2022 走看看