lower_bound、upper_bound函数

lower_bound和upper_bound

1. 概述

  • $lower_bound()$ 和$upper_bound()$ 都是基于二分查找在一个排好序的数组或容器(如 $vector,\ list,\ set$ )中进行快速查找的函数,位于 $$ 标准库中,由于采用二分查找,所以函数的时间复杂度是 $O(log_2^n)$
  • 划重点!基于二分查找!数组或容器必须有序!

2. 函数使用

  • $lower_bound(begin,end,num)$:适用于从小到大排序的有序序列,从数组/容器的 $begin$ 位置起,到 $end-1$ 位置结束,查找第一个大于等于 $num$ 的数字

    • 若找到则返回该数字的地址,通过减去起始地址 $begin$ 的技巧可以求得其在数组/容器中的下标,如 $lower_bound(arr,arr+n,3)-arr$ 表示在数组 $arr$ 中查找第一个大于等于 $3$ 的元素在数组中的下标
    • 若找不到,则返回 $end$,即数组/容器最后一个元素的下一个元素
  • $upper_bound(begin,end,num)$:适用于从小到大排序的有序序列,从数组/容器的 $begin$ 位置起,到 $end-1$ 位置结束,查找第一个大于 $num$ 的数字

    • 若找到则返回该数字的地址,通过减去起始地址 $begin$ 的技巧可以求得其在数组/容器中的下标,如 $upper_bound(arr,arr+n,3)-arr$ 表示在数组 $arr$ 中查找第一个大于 $3$ 的元素在数组中的下标

    • 若找不到,则返回 $end$,即数组/容器最后一个元素的下一个元素

  • $lower_bound(begin,end,num,greater())$:适用于从大到小排序的有序序列,从数组/容器的 $begin$ 位置起,到 $end-1$ 位置结束,查找第一个小于等于 $num$ 的数字

    • 若找到则返回该数字的地址,通过减去起始地址 $begin$ 的技巧可以求得其在数组/容器中的下标,如 $lower_bound(arr,arr+n,3,greater())-arr$ 表示在数组 $arr$ 中查找第一个小于等于 $3$ 的元素在数组中的下标
    • 若找不到,则返回 $end$,即数组/容器最后一个元素的下一个元素
  • $upper_bound(begin,end,num,greater())$:适用于从大到小排序的有序序列,从数组/容器的 $begin$ 位置起,到 $end-1$ 位置结束,查找第一个小于 $num$ 的数字

    • 若找到则返回该数字的地址,通过减去起始地址 $begin$ 的技巧可以求得其在数组/容器中的下标,如 $upper_bound(arr,arr+n,3,greater())-arr$ 表示在数组 $arr$ 中查找第一个小于 $3$ 的元素在数组中的下标

    • 若找不到,则返回 $end$,即数组/容器最后一个元素的下一个元素

3. 案例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<bits/stdc++.h>
#define x first
#define y second

using namespace std;

typedef long long ll;
typedef pair<int,int> PII;

// 解题思路:

const int N=1e5+5;

int main() {
// 升序
int arr[]={1,3,2,8,5};
sort(arr,arr+5);
cout<<"序列为(从小到大排序):";
for(auto x:arr) cout<<x<<' ';
cout<<endl;
// 1.lower_bound
cout<<lower_bound(arr,arr+5,5)-arr<<endl; // 第一个大于等于5的是5,下标是3
// 2.upper_bound
cout<<upper_bound(arr,arr+5,6)-arr<<endl; // 第一个大于6的是8,下标是4

// 降序
sort(arr,arr+5,greater<int>()); // greater<int>()表示降序规则
cout<<"序列为(从大到小排序):";
for(auto x:arr) cout<<x<<' ';
cout<<endl;
// 3.lower_bound
cout<<lower_bound(arr,arr+5,3,greater<int>())-arr<<endl; // 第一个小于等于3的是3,下标是2
// 4.upper_bound
cout<<upper_bound(arr,arr+5,3,greater<int>())-arr<<endl; // 第一个小于等于3的是2,下标是3
return 0;
}
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2015-2024 John Doe
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信