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;
} 
相关推荐
开开心心就好2 天前
安卓免费证件照制作软件,无广告弹窗
linux·运维·安全·pdf·迭代器模式·依赖倒置原则·1024程序员节
开开心心就好7 天前
轻量级PDF阅读器,仅几M大小打开秒开
linux·运维·服务器·安全·pdf·1024程序员节·oneflow
学传打活10 天前
【边打字.边学昆仑正义文化】_12_生命价值的体现(1)
微信公众平台·1024程序员节·汉字·昆仑正义文化
开开心心就好12 天前
小巧绿色免费关机工具,支持定时倒计时
linux·运维·服务器·安全·powerpoint·1024程序员节·foxmail
开开心心就好13 天前
跨平台高速下载工具,支持浏览器功能强大
运维·服务器·windows·pdf·旅游·媒体·1024程序员节
开开心心就好1 个月前
内存清理软件灵活设置,自动阈值快捷键清
运维·服务器·windows·pdf·harmonyos·risc-v·1024程序员节
学传打活1 个月前
【边打字.边学昆仑正义文化】_5_宇宙物种创造简史(1)
微信公众平台·1024程序员节·汉字·昆伦正义文化
xcLeigh1 个月前
打破机房围墙:VMware+cpolar构建跨网络虚拟实验室
vmware·内网穿透·cpolar·实验室·远程访问·1024程序员节
开开心心就好1 个月前
免费轻量电子书阅读器,多系统记笔记听书
linux·运维·服务器·安全·ddos·可信计算技术·1024程序员节