二分查找算法可以解决最简单的二分查找问题:a数组单调递增,并且其中没有重复的数值。我们遇到的实际问题可能就没有这么简单,可能会有重复的数值。比如a数组里有3个5。这时我们查找5就有一个问题:到底返回哪一个5的下标?

为了解决这些问题,C++ STL提供了两个特别好用的函数:lower_bound()和uppper_bound()。假设a是一个数组,n是数组长度,lower_bound(a, a+n, x)返回数组a[0]~a[n-1]中,大于等于x的数中,最小的数的指针。由于指针可以通过加减算偏移量,所以我们再减去a(数组名会被隐式转换成指针),就得到了相应的下标。我们看一下下面的例子,假设我们在a数组中找3这个数。

左边是a数组,当然这个a数组必须递增的,不然lower_bound()会出错。其中标红的是大于等于3的数。右边是lower_bound()的返回值减去a,是标红这些数里最小的一个的下标。注意最后一个例子,如果a数组中一个大于等于3的都没有,会返回数组长度n。

另一个函数叫做upper_bound()。同样假设a是一个数组,n是数组长度,upper_bound(a, a+n, x)返回数组a[0]~a[n-1]中,大于x的数中,最小的数的指针。

注意lower_bound是“大于等于”,upper_bound是“大于”。
我们看一下下面的例子,假设我们在a数组中找3这个数。

标红的部分是a数组中大于3的数。upper_bound的返回值减去a是这些数里最小的一个的下标。

其实对于lower_bound和upper_bound还有一个等价的解释。就是假设我要在a数组中插入x,然后还保持递增,那么lower_bound返回的是x最小的可以插入的数组位置,upper_bound返回的是x最大的可以插入的数组位置。

我们来通过一个程序看一下lower_bound和upper_bound的用法。

首先注意第一行,使用lower_bound和upper_bound需要包含algorithm头文件。然后注意第8~10行,lower_bound和upper_bound的返回值是整型指针。lower-a和upper-a是在做指针减法,结果是指针的偏移量,也就相当于是a数组的下标。程序运行的结果是最后注释的部分。

另外lower_bound和upper_bound的前两个参数是其实是待查范围的首尾指针(左闭右开区间,不包括尾指针),所以也可以写别的参数。比如下面的程序就是从a[1]开始查找:

上面我们介绍了lower_bound和upper_bound的用法。但是这两个函数是C++才有的。如果你平常用的是C或者Java怎么办呢?那我们只好写一个自己的my_lower_bound和my_upper_bound。首先我们定义一下my_lower_bound函数是这个样子:int my_lower_bound(int a[], int n, int x)

注意my_lower_bound和C++STL自带的lower_bound有区别,my_lower_bound的第一个参数是一个数组,第二个参数是数组长度,第三个参数是待查找的值;它的返回值是“大于等于x的数中,最小的数的下标“,另一个等价的说法是“假设在a数组中插入x,并保持插入后仍然有序,最小的合法插入下标”。

代码如下:

#include<cstdio>
#include<iostream>
using namespace std;
int n, x, a[100000];
int my_lower_bound(int a[], int n, int x){int l = 0;int r = n - 1;int ans = n;while(l <= r){int m = l + (r - l) / 2;if(a[m] >= x){ans = m;r = m - 1;}elsel = m + 1;}return ans;
}
int main()
{cin >> n >> x;for(int i = 0; i < n; i++)cin >> a[i];int lower = my_lower_bound(a, n, x);cout << lower << endl;return 0;
}

以上是my_lower_bound的代码,如果我们要实现my_upper_bound的代码,其实也很容易。my_lower_bound是找“大于等于x的数中,最小的数的下标“,所以第11行是if(a[m] >= x)。
my_upper_bound是找“大于x的数中,最小的数的下标“,所以只需要把第11行改成if(a[m]>x)即可。

lower_bound和upper_bound的用法相关推荐

  1. lower_bound( )和upper_bound( )的用法

    使用这两个函数都需要包含对应头文件 #include <algorithm> 这两个函数都是采用的二分算法 lower_bound(查找的起始位置,查找的终止为止,需要查找的数 )是返回第 ...

  2. lower_bound与upper_bound的用法

    1.作用 lower_bound会找出序列中第一个大于等于x的数 upper_bound会找出序列中第一个大于x的数 2.用法 对于一个数组a,在[1,n]的区间内查找大于等于x的数(假设那个数是y) ...

  3. C语言bound函数,C/C++-STL中lower_bound与upper_bound的用法以及cmp函数

    ng-repeat里创建的自定义指令 在ng里,所有的指令在按照意愿正常工作之前的都需要编译一下,包含angularJS的自定义指令. ng模板里的所有指令都会在angularJS加载完毕之后编译一下 ...

  4. lower_bound()与upper_bound()

    lower_bound和upper_bound函数用法 一,在数组中使用lower_bound()upper_bound() 二.STL中的lower_bound()和upper_bound() lo ...

  5. lower_bound和 upper_bound 用法(STL)

    lower_bound和 upper_bound的头文件是#include<algorithm> lower_bound 返回第一个大于等于 x 的数的地址/迭代器 upper_bound ...

  6. upperbound找不到_关于lower_bound( )和upper_bound( )的常见用法

    头文件:#include lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的. 在从小到大的排序数组中, lower_bound( begi ...

  7. 关于lower_bound( )和upper_bound( )的常见用法

    ower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的. 在从小到大的排序数组中, lower_bound( begin,end,num):从数组 ...

  8. lower_bound( )和upper_bound( )的常见用法

    ower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的. 在从小到大的排序数组中, lower_bound( begin,end,num):从数组 ...

  9. C++ lower_bound() upper_bound() 函数用法详解(深入了解,一文学会)

    find().find_if().search() 等.值得一提的是,这些函数的底层实现都采用的是顺序查找(逐个遍历)的方式,在某些场景中的执行效率并不高.例如,当指定区域内的数据处于有序状态时,如果 ...

最新文章

  1. Udacity机器人软件工程师课程笔记(十)-ROS-Catkin-包(package)和gazebo
  2. Node HTTP/2 Server Push 从了解到放弃
  3. 开发中经常碰到的问题cookie和session问题,今天一并解决
  4. win10:tensorflow学习笔记(2)
  5. warning C4828问题的处理
  6. Python日历模块| weekheader()方法与示例
  7. python【第十四篇】HTML基础
  8. IE8 默认以Web Standards模式显示网页 全面遵循Web标准
  9. 天语手机android 4.4.4,天语 V8 4.4.4 ROM刷机包 MIUI 6 合作版
  10. 我经历的学术与论文写作
  11. 利用python爬取租房信息_Python实战:爬取租房信息
  12. [每日一氵] Python以管理员权限运行程序
  13. 选择SAP IBP(集成业务计划云)的十大理由
  14. Google Earth Engine——MERRA-2 M2T1NXAER:1980-2022年气溶胶逐日数据集
  15. MySql数据库中的权限授予
  16. 如何通过微信创业赚钱
  17. 【一些话】陈怡然教授:年底了,和学生说两句心里的鸡汤
  18. 伟大的牛逼之前都是傻逼式的坚持
  19. Scanner.next()和Scanner.nextLine()的区别
  20. java 全局缓存_java本地缓存

热门文章

  1. ftpclient查看服务器文件,使用Apache FtpClient在FTP服务器中计算文件校验和
  2. Mixlab做客VLAND TALK,一起聊聊如何策划一场元宇宙活动
  3. 为什么程序员适合做自由职业者
  4. Ghost硬盘对拷图解教程(双硬盘克隆)
  5. 问题: return unicode(text, encoding, errors=errors) UnicodeDecodeError: ‘utf-8‘ codec can‘t decode
  6. 机房环境监控系统机房守护者!
  7. 刷机时代落幕——刷机现状、原理及方法步骤
  8. 从“被动挖光缆”到“主动剪网线”,蚂蚁金服异地多活的微服务体系
  9. python练习题:045:正常血压——MOOC郭炜
  10. 2010数据库技术大会演讲主题PPT下载