目录
题目:编辑
题目思路:
解释:
方法:
对于k值所在左边界:
对于k值所在右边界:
代码详解:
题目:
链接:789. 数的范围 - AcWing题库https://www.acwing.com/problem/content/791/
题目思路:
解释:
如果该题用二分取做
那么该题是一道很考验
你对二分的原理的一道题
可以帮助你取更好的理解二分
因为题目中数字并不是每个只单独
出现一次的升序序列
是有重复数字的升序序列
这就要求我们要用两种不同
的二分方法取找到区间的左右边界值
从而解决题目
方法:
对于二分我们可以采用两种不同的方式去写
而这两种方法的关键就在于
我们如何去取if的判断条件
对于k值所在左边界:
因左边界的左边都是不满足条件的区间
而右边则可能存在满足条件的区间
我们就可以采用不断逼近的方式
来达到目的
就可以设定条件if(a[mid]>=x)
对于k值所在右边界:
同上
代码详解:
#include<iostream>
using namespace std;
const int N=100006;
int a[N];
int n,q;
int main(){
scanf("%d%d",&n,&q);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
while(q--){
int k;
scanf("%d",&k);
int l=0,r=n-1;
while(l<r){
int mid=l+r>>1;//向下取整
//mid大于等于k用来不断接近 要找的数字的区间左边界
if(a[mid]>=k) r=mid;
else l=mid+1;
}
if(a[l]==k){
printf("%d ",l);
r=n-1;
while(l<r){
int mid=l+r+1>>1;//向上取整
//mid小于等于k用来不断接近 要找的数字的区间右边界
if(a[mid]<=k) l=mid;
else r=mid-1;
}
printf("%d\n",r);
}else{
printf("-1 -1\n");
}
}
return 0;
}
PS:人生只若初见,何事秋风悲画扇。