lower_bound()返回的是要查找的数的最小下标,upper_bound()则返回的是最大下标
两者都是用二分查找,需要先排序。两者相减得到的则是一共有多少个要查找的数的个数减一
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 1000;
int n, k;
int a[MAXN];
int lower_bound()
{
int lb = -1;
int rb = n;
bool flag = false; // 判断是否找到了这个数
while(rb - lb > 1) // 直到解的范围不大于1
{
int mid = (lb + rb) / 2;
if(!flag && a[mid] == k)
flag = true;
if(a[mid] >= k)
rb = mid;
else
lb = mid;
}
if(flag)
return rb;
else
return -1;
}
int upper_bound()
{
int lb = -1;
int rb = n;
bool flag = false;
while(rb - lb > 1)
{
int mid = (lb + rb) / 2;
if( !flag && a[mid] == k)
flag = true;
if(a[mid] <= k)
lb = mid;
else
rb = mid;
}
if(flag)
return lb;
else
return -1;
}
int main()
{
scanf("%d %d", &n, &k);
for(int i=0; i<n; i++)
scanf("%d", &a[i]);
sort(a, a+n);
int index1 = lower_bound();
int index2 = upper_bound();
printf("%d %d\n", index1, index2);
printf("%d\n", upper_bound() - lower_bound());
return 0;
}