作业介绍

王老师_区赛复习6_二分查找

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
//二分查找===折半查找
//比如我们现在有一个数组  长度是1e5  10w
//我们现在想在这个数组里面查找某个数字有没有出现过 ,比如我们要找数字x
//假设要询问10w次,那就会超时
//所以我们需要一个算法,帮助我们快速的查找某个数字有没有在数组里面出现过
//二分查找这个算法,可以帮助我们解决这个问题
//二分查找的特点:思想非常非常好理解,但是代码的细节多一些,要求同学听课认真+思考认真
//现在介绍二分查找的代码逻辑:我们用双指针能够选取一段范围,我们会在这段范围里面寻找我们的目标值
//每一次会把当前这段范围的中间值 和 目标值做比较 大于 等于 小于 直到找到答案 或者l>r
//二分查找是非常非常快 二分查找的前提条件:数组要有序,从小到大
//这个函数是在a数组里面查找数字x有没有出现过,如果数字x出现过 函数返回1 
//如果数字x没有出现过  函数返回0
int bs(int x){//binary_search
    int l=1,r=n;//细节1:左右指针的初始值
    //left  right
    while(l<=r){//细节2:while循环里面的条件100000% 是 l<=r
        int mid=(l+r)/2;//mid是中间
        if(a[mid]==x) return 1;
        if(a[mid]>x)  r=mid-1;//细节3:r=mid   l=mid 一定不可以
        if(a[mid]<x)  l=mid+1;
    }
    return 0;
}
6--> 1 2 2 2 2 2 
//查找数字x  第一次出现的位置
int bs2(int x){//binary_search
    int l=1,r=n,ans=-1;//ans帮助我们记录数字x第一次出现的位置
    while(l<=r){
        int mid=(l+r)/2;
        if(a[mid]==x) ans=mid,r=mid-1;
        if(a[mid]>x)  r=mid-1;
        if(a[mid]<x)  l=mid+1;
    }
    return ans;
}
//查找数字x  最后一次出现的位置
int bs3(int x){//binary_search
    int l=1,r=n,ans=-1;//ans帮助我们记录数字x第一次出现的位置
    while(l<=r){
        int mid=(l+r)/2;
        if(a[mid]==x) ans=mid,l=mid+1;
        if(a[mid]>x)  r=mid-1;
        if(a[mid]<x)  l=mid+1;
    }
    return ans;
}
//结合bs2和bs3  可以帮助我们快速的计算出来 数字x出现过多少次
//6---> 1 2 3 4 5 6
//在a数组中查找  大于x第一个位置
int  bs4(int x){
    int l=1,r=n,ans=-1;
    while(l<=r){
        int mid=(l+r)/2;
        if(a[mid]>x) ans=mid,r=mid-1;
        else l=mid+1;
    }
    return ans;
}
//我们使用bs4 可以帮助我们快速的计算 在a数组当中 大于x的数据有几个
//在a数组中查找  大于等于x第一个位置
int  bs5(int x){
    int l=1,r=n,ans=-1;
    while(l<=r){
        int mid=(l+r)/2;
        if(a[mid]>=x) ans=mid,r=mid-1;
        else l=m+1;
    }
    return ans;
}
//8--->1 2 3 3 4 5 5 6
//在a数组当中 查找小于x的最后一个位置
int  bs6(int x){
    int l=1,r=n,ans=-1;
    while(l<=r){
        int mid=(l+r)/2;
        if(a[mid]<x) ans=mid,l=mid+1;
        else r=mid-1;
    }
    return ans;
}
//在a数组当中 查找小于等于x的最后一个位置
int  bs7(int x){
    int l=1,r=n,ans=-1;
    while(l<=r){
        int mid=(l+r)/2;
        if(a[mid]<=x) ans=mid,l=mid+1;
        else r=mid-1;
    }
    return ans;
}
//结合bs5 和bs7  有组合技 可以帮助我们快速查询 数组中有几个数据的范围在 [x,y]  
//然后如果某个函数返回-1  说明不存数据在这个范围内----->0
int n,a[N];
int main(){




    return 0;
}

题目

认领作业后才可以查看作业内容。
状态
正在进行…
题目
17
开始时间
2025-11-29 0:00
截止时间
2026-1-10 23:59
可延期
24 小时