刷题的时候经常会遇到这样的情况:假如我们需要在一个降序序列b中查找第一个小于x的数,该怎么快速完成呢?
如果正常遍历,时间复杂度是O(n).
如果编写一个二分查找函数,又比较浪费编码时间。
cpp中的lower_bound()函数和upper_bound()函数就能解决这个问题,时间复杂度为O(logn).
代码如下:
#include <bits/stdc++.h>
using namespace std;
int a[6] = {1, 3, 5, 9, 14, 23};
int b[6] = {23, 14, 9, 5, 3, 1};
bool cmp(const int& a,const int& b){return a > b;}
int main() {
int i;
i = lower_bound(a, a+6, 3)-a;
cout<<"第一个大于等于3的数:"<<a[i]<<endl;
i = upper_bound(a, a+6, 3)-a;
cout<<"第一个大于3的数:"<<a[i]<<endl;
i = lower_bound(b, b+6, 3, cmp)-a;
cout<<"第一个小于等于3的数:"<<a[i]<<endl;
i = upper_bound(b, b+6, 3, cmp)-a;
cout<<"第一个小于3的数:"<<a[i]<<endl;
i = lower_bound(b, b+6, 3, greater<int>())-a;
cout<<"第一个小于等于3的数:"<<a[i]<<endl;
i = upper_bound(b, b+6, 3, greater<int>())-a;
cout<<"第一个小于3的数:"<<a[i]<<endl;
return 0;
}
结果:
第一个大于等于3的数:3
第一个大于3的数:5
第一个小于等于3的数:3
第一个小于3的数:1
第一个小于等于3的数:3
第一个小于3的数:1