20251020二分总结

引子

需要引子吗?

洛谷 P2249 【深基13.例1】查找

题目简化就是说给你n个单调不减的数,进行m次询问,每次询问给定一个数x,求x再这n个数当中最早出现的下标。

其实就是二分查找板子,只要套一下STL的二分查找函数就行了,或手搓二分查找;第二种做法就是用map充当桶数组。

在这里介绍一下二分查找函数:lower_bound以及upper_bound

其实都差不多,只不过lower_bound找的是序列里第一个大于等于这个数的下标,upper_bound找的是序列里第一个大于这个数的下标。

具体用法,()_bound(数组名+起始下标,数组名+结束下标,要找的数)-数组名

这道题用的肯定是lower_bound,首先用lower_bound查一遍要找的数,然后看找到的数跟要找的数是不是一样的。

时间复杂度O(mlogn)O(mlogn)O(mlogn)

cpp 复制代码
#include<bits/stdc++.h>//二分查找写法
using namespace std;
int a[1000005];
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    while(m--){
        int x;
        cin>>x;
        int y=lower_bound(a+1,a+1+n,x)-a;//有函数为什么还要手搓?
        if(x!=a[y]){//如果找到的数不是一样的
            cout<<-1<<" ";
        }else{
            cout<<y<<" ";
        }
    }
    return 0;
} 

map桶数组写法就是用一个map数组来记录每个数最早出现的下标,因为给的数组是单调不减的,所以只要看输入的数有没有被记录过,没记录过就更新就行了。

当然,还是因为给的数组是单调不减的,所以用unordered_map可以省那么一丢丢。

时间复杂度理想下O(n+m)O(n+m)O(n+m)

cpp 复制代码
#include<bits/stdc++.h>//map桶数组写法
using namespace std;
unordered_map<int,int> t;
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        if(!t[x]){//如果没记录过
            t[x]=i;
        }
    }
    while(m--){
        int x;
        cin>>x;
        if(!t[x]){//如果这个数没有出现过
            cout<<-1<<" ";
        }else{
            cout<<t[x]<<" ";
        }
    }
    return 0;
} 
相关推荐
落羽的落羽11 小时前
【Linux系统】从零掌握make与Makefile:高效自动化构建项目的工具
linux·服务器·开发语言·c++·人工智能·机器学习·1024程序员节
电子云与长程纠缠11 小时前
Blender入门学习06 - 粒子
学习·blender·1024程序员节
_extraordinary_11 小时前
Java SpringAOP --- AOP的使用,AOP的源码
java·spring·1024程序员节
爱看科技11 小时前
亚马逊“Amelia”智能眼镜登场,三星/微美全息加速AI+AR技术融合引领穿戴赛道!
1024程序员节
Aevget11 小时前
界面控件Kendo UI for Angular 2025 Q3亮点 - 全新的AI编码助手
ui·界面控件·kendo ui·ui开发·1024程序员节
KevinPedri11 小时前
测试:uk8s创建监控和告警同步飞书等渠道
docker·kubernetes·云计算·1024程序员节
葱头的故事11 小时前
vant van-uploader上传file文件;回显时使用imageId拼接路径
前端·1024程序员节
-森屿安年-11 小时前
STL 容器:List
开发语言·c++·list·1024程序员节
小朩11 小时前
数据结构C语言
数据结构·c#·1024程序员节