头文件:
#include <algorithm>
using namespace std;
时间复杂度:一次查询O(log n),n为数组长度。
示图如下:
lower_bound:
功能:查找非递减序列[first,last) 内第一个大于或等于某个元素的位置。
返回值:如果找到返回找到元素的地址否则返回last的地址。(这样不注意的话会越界,小心)
用法:int t=lower_bound(a+l,a+r,key)-a;(a是数组)。
upper_bound:
功能:查找非递减序列[first,last) 内第一个大于某个元素的位置。
返回值:如果找到返回找到元素的地址否则返回last的地址。(同样这样不注意的话会越界,小心)
用法:int t=upper_bound(a+l,a+r,key)-a;(a是数组)。
经典例题:
1:扔盘子
2: 天梯赛列车调度
基础样例代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int arr[10] = {1,3,5,7,9};
int ps1 = upper_bound(arr,arr+5,5) - arr;
int ps2 = lower_bound(arr,arr+5,3) - arr;
printf("%d %d",arr[ps1],arr[ps2]);
return 0;
}
结果:
set集合中自带lower_bound(key),upper_bound(key)方法 只需要传递一个参数
基础样例代码:
#include<stdio.h>
#include<set>
using namespace std;
int main()
{
set<int> s;
for(int i=1;i<10;i++)
s.insert(i);
//s.upper_bound(key) 返回的是一个iterater类型的 即key的地址
if(s.upper_bound(5)!=s.end()){
printf("%d\n",*s.upper_bound(5));
}
if(s.lower_bound(5)!=s.end()){
printf("%d",*s.lower_bound(5));
}
return 0;
}
结果: