二分法(找最左边 和最右边)

该文详细介绍了二分查找的时间复杂度为O(logn),并提供了C++代码示例,分别演示了找到数组中第一个大于等于目标值的元素和最后一个小于等于目标值的元素的过程。在最左边的搜索中,右边界不断收缩;在最右边的搜索中,左边界向右移动,注意处理边界条件以避免死循环。
摘要由CSDN通过智能技术生成

二分时间复杂度

时间复杂度为 logn; 每次都是 减少一半 如 2^5 个 只需5次

二分代码

#include <iostream>
using namespace std;
const int N=1e5+10;
int arr[N];
int n,m;
int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++){
        cin>>arr[i];
    }
    while(m--){
        int x,a,b;
        cin>>x;
        int l=0,r=n-1;
        int mid;
        //找的是最左边 当>=x 时 是 r在往右走  
        while(l<r){
            mid=l+r>>1;
            if(arr[mid]>=x)r=mid;
            else l=mid+1;
        }
        a=l;l=0;r=n-1;
        //找的是最右边 当<=x 时 是 l 在往左走 加一是
        //这里 加一的原因是 当 l=mid 时 ,如果l=r-1    mid=l+r/2 mid=l 就会发生死循环
        while(l<r){
            mid=l+r+1>>1;
            if(arr[mid]<=x)l=mid;
            else r=mid-1;
        }
        b=l;
        if(arr[a]!=x || arr[b]!=x)cout<<-1<< " "<<-1<<endl;
        else cout<<a<<" "<<b<<endl;
    }
}

原理

最左边

一定是 r在往左走 所以是 >=x

最右边

一定是 l在往右走 所以是 <=x
但是 考虑这个时 需要 mid=l+r+1 防止l=r-1 时 mid还是等于l 那么就会发生死循环
大佬点个赞

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值