AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 应用
  • 更多
    • 题解
    • 分享
    • 商店
    • 问答
    • 吐槽
  • App
  • 登录/注册

AcWing 789. 数的范围    原题链接    简单

作者: 作者的头像   xyw_6 ,  2023-03-19 13:00:49 ,  所有人可见 ,  阅读 30


0


时间复杂度

o(logn)的时间复杂度 , 查找效率是非常高的!

C++ 代码

模板 1 返回查找数的区间的左指针;
#include<iostream>

using namespace std;

const int N = 10000010;

int n , k;
int a[N];
// 返回左区间的位置 
int binary_search(int b , int e , int k){
    int l = b -1 , r = e + 1;

    while(l+ 1 < r){
        int mid = l + r >> 1;
        if(a[mid] >= k) r = mid;    
        else  l = mid; 
//  printf("l == %d , r == %d , mid == %d\n",l ,r, mid);
    }
    if(a[r] == k)
        return r;
    return -1;  
}
int main(){
    scanf("%d%d", &n, &k);
    for(int i=1; i<=n; i++)     scanf("%d",&a[i]);
    int index = binary_search(1 , n , k + 1);
    printf("%d",index);
}
模板 2 返回查找区间的右指针
#include<iostream>

using namespace std;

const int N = 100010;

int n , k;
int a[N];

// 返回区间的右指针; 
int binary_search(int b , int e , int k){
    int l = b - 1 , r = e + 1;

    while(l + 1 < r){
        int mid = l + r >> 1;
        if(a[mid] <= k) l = mid;
        else r = mid;
    }

    if(a[l] == k)
        return l;
    return -1;
}
int main(){
    scanf("%d%d",&n,&k);
    for(int i=1; i<=n; i++)     scanf("%d", &a[i]);
    int index = binary_search(1, n , k);
    printf("%d",index);
    return 0;
} 

主要思想

对有序数组的二分查找
做到返回区间左右边界的原因是 尽量的向符合条件的区间收紧。这个‘=’就是灵魂 if(a[mid] <= k)

0 评论

你确定删除吗?
1024
x

© 2018-2023 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息