在解决问题的过程中,我们会需要进行以下步骤:
求出数组中第一个大于等于 x x x 或第一个大于 x x x 的数,如果这时数据很大并且我们去遍历的话,时间复杂度为 O ( n ) O(n) O(n),这时候我们可以考虑二分,也可以考虑 C++ 自带的 STL 中的 lower_bound 与 upper_bound 来做,所以我们来讲一下这两个函数。
值得注意的是,这两个函数仅适用于非递减序列中,否则会导致未知错误。
lower_bound
lower_bound求的是非递减序列中第一个大于等于 x x x 的数。
一般形式:
lower_bound(数组名+第一个元素下标,数组名+数组长度,查找元素)-数组名
upper_bound
upper_bound求的是非递减序列中第一个大于 x x x 的数。
一般形式:
upper_bound(数组名+第一个元素下标,数组名+数组长度,查找元素)-数组名
这两个函数返回的是对应数的下标,若没找到,返回数组长度+1,即 n+1。
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int f[100];
int n;
int maxn;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&f[i]),maxn=max(maxn,f[i]);
sort(f+1,f+1+n);//必须是非递减序列
cout<<lower_bound(f+1,f+1+n,maxn)-f<<endl;//找大于等于maxn的第一个数
cout<<upper_bound(f+1,f+1+n,maxn)-f<<endl;//找大于maxn的第一个数,没有返回n+1
cout<<upper_bound(f+1,f+1+n,maxn-1)-f<<endl;
return 0;
}