目录
题目:编辑
题目思路:
解释:
方法:
对于k值所在左边界:
对于k值所在右边界:
代码详解:
题目:
 
 链接:789. 数的范围 - AcWing题库 https://www.acwing.com/problem/content/791/
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:人生只若初见,何事秋风悲画扇。


















