题目链接:数的范围
#include <iostream>
#define MAXN 100005
using namespace std;
int arr[MAXN];
int main() {
int n,q,k;cin>>n>>q;
for(int i=0;i<n;i++) cin>>arr[i];
while(q--){
cin>>k;
int l=0,r=n-1,mid;
while(l<r){ //将区间分为[l,mid],[mid+1,r]
mid=l+r>>1; //不需要+1
if(arr[mid]>=k) r=mid;
else l=mid+1; //能够找到左边界
}
if(arr[l]!=k) cout<<"-1 -1"<<endl;
else{
cout<<l<<" ";
l=0,r=n-1;
while(l<r){ //将区间分为[l,mid-1],[mid,r]
mid=l+r+1>>1; //需要+1
if(arr[mid]<=k) l=mid;
else r=mid-1; //能够找到右边界
}
cout<<l<<endl;
}
}
return 0;
}
lower_bound与upper_bound函数:
注意:使用时需减去数组a,否则返回的是地址。并且数组a需要是单增的!!!!
lower_bound():返回大于或等于目标值的第一个位置
upper_bound():返回大于目标值的第一个位置参数为 a,a+n,val,如果val大于数组中最大的数,会返回数组长度。
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int a[8]={0,1,2,3,3,5,6,7};
int pos_1=lower_bound(a,a+8,3)-a;
cout<<pos_1<<endl; //3
int pos_2=lower_bound(a,a+8,-1)-a;
cout<<pos_2<<endl; //0
int pos_3=upper_bound(a,a+8,3)-a;
cout<<pos_3<<endl; //5
int pos_4=upper_bound(a,a+8,8)-a;
cout<<pos_4<<endl; //8
return 0;
}
如果原数组为单减的,需用第四个参数greater<int>()
lower_bound():返回小于或等于目标值的第一个位置
upper_bound():返回小于目标值的第一个位置如果val小于数组中最小的数,会返回数组长度。
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int a[8]={7,6,5,3,3,2,1,0};
int pos_1=lower_bound(a,a+8,3,greater<int>())-a;
cout<<pos_1<<endl; //3
int pos_2=lower_bound(a,a+8,-1,greater<int>())-a;
cout<<pos_2<<endl; //8
int pos_3=upper_bound(a,a+8,3,greater<int>())-a;
cout<<pos_3<<endl; //5
int pos_4=upper_bound(a,a+8,-1,greater<int>())-a;
cout<<pos_4<<endl; //8
return 0;
}
ps:查找小数也可以用