算法|基础算法|二分和双指针

news2025/1/22 19:53:50

数学与数论|二分

1.基础二分
2.双指针

心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。
在这里插入图片描述

基础二分

模板

bool check(int x){/*...*/} //检查是否满足某种性质

//区间[l,r]被划分成[l,mid]和[mid+1,r]时使用:
int bsearch_1(int l,int r){
    while(l<r){
        int mid = l+r>>1;
        if(check(mid)) r=mid;//check()判断mid是否满足性质
        else l=mid+1;
    }
    return l;
}
//区间[l,r]被划分为[l,mid-1]和[mid,r]时使用:
int bsearch_2(int l,int r){
    while(l<r){
        int mid=l+r+1>>1;
        if(check(mid)) l=mid;
        else r=mid-1;
    }
    return l;
}

题目描述
给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。
对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。
如果数组中不存在该元素,则返回 -1 -1。
输入格式
第一行包含整数 n 和 q,表示数组长度和询问个数。
第二行包含 n 个整数(均在 1∼10000 范围内),表示完整数组。
接下来 q 行,每行包含一个整数 k,表示一个询问元素。
输出格式
共 q 行,每行包含两个整数,表示所求元素的起始位置和终止位置。
如果数组中不存在该元素,则返回 -1 -1。
数据范围
1≤n≤100000
1≤q≤10000
1≤k≤10000
输入样例:
6 3
1 2 2 3 3 4
3
4
5
输出样例:
3 4
5 5
-1 -1

实践代码:

void solve(){
    int n,q;cin>>n>>q;
    vector<int> a(n);
    for(int i=0;i<n;i++) cin>>a[i];
    while(q--){
        int k;cin>>k;
        int l=0,r=n-1;
        while(l<r){//从右向左找到起始位置
            int mid=l+r>>1;
            if(a[mid]>=k) r=mid;//check
            else l =mid+1;
        }
        if(a[l]!=k) {cout<<"-1 -1"<<endl;continue;}//没找到
        if(a[l]==k) cout << l << ' ';
        while (l < r) {//从左向右找到终止位置
            int mid = l+r+1>>1;
            if (a[mid]<=k) l=mid;//check
            else r =mid-1;
        }
        cout << l << endl;
    }
}

双指针

双指针:两个变量模拟指针的功能在数组间移动
1.两个指针之间的区间1具备某种特征
2.两个指针所指的东西要满足一些条件

题目描述
给定一个长度为n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
输入格式
第一行包含三个整数n。
第二行包含n个整数(均在0~105范围内),表示整数序列。
输出格式
共1行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
数据范围
1 ≤ n ≤ 105
输入样例
5
1 2 2 3 5
输出样例
3

实践代码:

void solve(){
    int n;cin>>n;
    int ans=0;
    vector<int> a(n+1);
    map<int,int> mp;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=0,j=0;i<n;i++){
        mp[a[i]]++;
        while(mp[a[i]]>1) {mp[a[j]]--;j++;}
        ans=max(ans,i-j);
    }
    cout<<ans;
}

例题 (双指针+二分)
题目描述
给定一个长度为n的数组a和一个整数m,求其中有多少对二元组(ai,aj)满足:
1 ≤ i ≤ j ≤ n 且 ai+aj > m
输入格式
第一行两个整数n,m,意义如上。(1≤n≤2x105,1≤m≤109)
第二行n个整数,第i个整数表示ai。(0≤ai≤109)
输出格式
一个数字,表示满足条件的二元组的个数。
输入样例
53 5
2 3 4
输出样例
32

注意
设i,j为双指针,定右端点j,j每次向右+1,i在小于j的区间二分找a[i]+a[j]>m的第一个下标i

补充:
lower_bound()/upper_bound()

/*lower_bound()/upper_bound()
     *在已升序排序的元素中,应用二分查找检索指定元素,返回对应元素迭代器位置,找不到则返回尾迭代器
     * lower_bound():寻找>=x的第一个元素的位置
     * upper_bound():寻找>x的第一个元素的位置
     * 怎么找<=x/<x的第一个元素呢?
     * >x的第一个元素的前一个元素(如果有)便是<=x的第一个元素
     * >=x的第一个元素的前一个元素(如果有)便是<x的第一个元素
     * 返回的是迭代器,如何转成下标索引呢?减去头迭代器即可。
     * */
    cout<<"lower_bound()/upper_bound():"<<endl;
    vector<int> arr4{0,1,1,1,8,9,9};
    //找下标(位置)
    int pos1 = lower_bound(arr4.begin(),arr4.end(),8)-arr4.begin();
    cout<<pos1<<endl;
    int pos2 = upper_bound(arr4.begin(),arr4.end(),8)-arr4.begin();
    cout<<pos2<<endl;
    //找不到返回尾迭代器
    vector<int>::iterator it = lower_bound(arr4.begin(),arr4.end(),99);
    int idx = it - arr4.begin();
    cout<<idx<<endl;

    int pos3= upper_bound(arr4.begin(),arr4.end(),99)-arr4.begin();
    if(pos3==arr4.size()){
        cout<<"No Found!"<<endl;
    }

在这里插入图片描述

实践代码:

void solve(){
   int n,m;cin>>n>>m;
   for(int i=1;i<=n;i++)cin>>a[i];
   sort(a+1,a+1+n);
   int ans=0;
   for(int j=1;j<=n;j++){
       int i= upper_bound(a+1,a+j,m-a[j])-a;//底层是二分,找到小于j且a[i]>m-a[j]的第一个下标i
       ans+=j-i;
   }
   cout<<ans<<endl;
}

心有猛虎,细嗅蔷薇。再见了朋友~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1529290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring suite搭建springboot操作

一、前言 有时候久了没开新项目了&#xff0c;重新开发一个新项目&#xff0c;搭建springboot的过程都有点淡忘了&#xff0c;所有温故知新。 二、搭建步骤 从0开始搭建springboot 1&#xff0e;创建work空间。步骤FileNewJava Working Set。 2.选择Java Working Set。 3.自…

Java八股文(RabbitMQ)

Java八股文のRabbitMQ RabbitMQ RabbitMQ RabbitMQ 是什么&#xff1f;它解决了哪些问题&#xff1f; RabbitMQ 是一个开源的消息代理中间件&#xff0c;用于在应用程序之间进行可靠的异步消息传递。 它解决了应用程序间解耦、消息传递、负载均衡、故障恢复等问题。 RabbitMQ …

SpringCloud Bus 消息总线

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第八篇&#xff0c;即介绍 Bus 消息总线。 二、概述 2.1 遗留的问题 在上一篇文章的最后&#xff0c;我…

Gradle v8.5 笔记 - 从入门到进阶(基于 Kotlin DSL)

目录 一、前置说明 二、Gradle 启动&#xff01; 2.1、安装 2.2、初始化项目 2.3、gradle 项目目录介绍 2.4、Gradle 项目下载慢&#xff1f;&#xff08;万能解决办法&#xff09; 2.5、Gradle 常用命令 2.6、项目构建流程 2.7、设置文件&#xff08;settings.gradle.…

15|BabyAGI:根据气候变化自动制定鲜花存储策略

一种新型的代理——Autonomous Agents&#xff08;自治代 理或自主代理&#xff09;&#xff0c; 在 LangChain 的代理、工具和记忆这些组件的支持下&#xff0c;它们能够在无需外部干预的情况下自主 运行&#xff0c;这在真实世界的应用中具有巨大的价值。 AutoGPT 它的主要…

晶圆制造过程中常用载具的类型

晶圆载具用于硅片生产、晶圆制造以及工厂之间晶圆的储存、传送、运输以及防护。晶圆载具种类很多,如FOUP用于晶圆制造工厂中晶圆的传送;FOSB用于硅片生产与晶圆制造工厂之间的运输;CASSETTE载具可用于工序间运送以及配合工艺使用。 OPEN CASSETTE OPEN CASSETTE主要在晶圆…

机器视觉系统选型-镜头基础知识

广角镜头&#xff1a;焦距小于标准焦距50mm的。例如&#xff1a;16mm 景深大&#xff0c;聚焦距离更近 远距照像镜头&#xff1a;焦距大于标准焦距50mm的。例如&#xff1a;75mm 景深浅&#xff0c;放大远距离物体 变焦镜头&#xff1a;镜头焦距可调节&#xff0c;焦距有范围&a…

JWT(跨域身份验证解决方案)

Json web token (JWT), 跨域身份验证解决方案,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于…

学习总结!

最近主要学习了java&#xff0c;题目的话就写了两道。 这道题目运用三维的bfs&#xff0c;第一次做时无从下手&#xff0c;原来可以利用三维数组&#xff08;第一次用三维数组&#xff09;可以解决这类问题&#xff0c;然后套bfs模板即可。 #include<iostream> #include…

Pandas:如何让你的代码性能飙升

在数据分析相关的工作中&#xff0c;Pandas无疑是一个强大的工具&#xff0c;它的易用性和灵活性广受青睐。然而&#xff0c;随着数据量的不断增长和计算需求的日益复杂&#xff0c;Pandas代码的性能问题也逐渐浮出水面。如何让Pandas代码运行得更快、更高效&#xff0c;成为了…

电子科技大学链时代工作室招新题C语言部分---题号G

1. 题目 问题的第一段也是非常逆天&#xff0c;说实话&#xff0c;你编不出问题背景可以不编。 这道题的大概意思就是&#xff0c; Pia要去坐飞机&#xff0c;那么行李就有限重。这时Pia想到自己带了个硬盘&#xff0c;众所周知&#xff0c;硬盘上存储的数据就是0和1的二进制序…

StartAI创成式填充(扩图)功能使用教程 约等于Photoshop Beta 25.0

创成式填充&#xff0c;是基于原有图片进行扩展或延展&#xff0c;在保证图片合理性的同时实现与原图片的高度契合。StartAI PS智能AI插件通过【扩图】&#xff0c;【局部重绘】&#xff0c;【背景移除】等功能来实现PS的“创成式填充” StartAI当前最新版本&#xff1a;V0.7.…

rabbitmq-spring-boot-start配置使用手册

rabbitmq-spring-boot-start配置使用手册 文章目录 1.yaml配置如下2.引入pom依赖如下2.1 引入项目resources下libs中的jar包依赖如下2.2引入maven私服依赖如下 3.启动类配置如下4.项目中测试发送消息如下5.项目中消费消息代码示例6.mq管理后台交换机队列创建及路由绑定关系如下…

Maven项目如何导入依赖包

一、导入依赖包 导入mysql依赖包 第一步&#xff1a;登录Maven官网 Maven官网&#xff1a;https://mvnrepository.com/search?qmysql 第二步&#xff1a;点击MySql Connector Java 第三步&#xff1a;点击任意一个版本 第四步&#xff1a;将以下内容复制到pom.xml中 导入j…

【MATLAB源码-第165期】基于matlab的科莫多巨蜥算法(KMA)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 科莫多巨蜥算法&#xff08;Komodo Mlipir Algorithm&#xff0c;简称KMA&#xff09;是一种受到印尼科莫多岛上独特生物——科莫多巨蜥启发的创新算法。尽管这个算法的名称听起来很有趣&#xff0c;但实际上它并不是一个公认…

【Godot4.2】2D导航04 - TileMap导航的逻辑

基于NavigationRegion2D 我们基于NavigationRegion2D的逻辑一文的场景结构&#xff0c;但是将NavigationRegion2D删除&#xff0c;更改为TileMap节点。 为TileMap创建Tileset&#xff0c;并创建一个导航层。在TileSet面板中&#xff0c;为草地和黄色泥土地面图块绘制可通行区…

PX4|基于FAST-LIO mid360的无人机室内自主定位及定点悬停

目录 前言环境配置运行fast-lio修改px4位置信息融合方式编写位置坐标转换及传输节点 前言 在配置mid360运行环境后&#xff0c;可使用mid360进行室内的精准定位。 环境配置 在livox_ros_driver2的上级目录src下保存fast-lio的工程 git clone https://github.com/hku-mars/F…

springboot企业级抽奖项目-整体展示

项目地址 GitHub - kiorr/lottery: 企业红包雨项目 star截图q&#xff1a;3353441618可以领取资料 原型效果 前台 后台 业务分析 项目介绍 项目概述 京东的红包雨大家可能都参与过&#xff0c;在某段时间内随机发放不同的红包 本项目为一个通用的红包雨模式抽奖系统&…

服务器端(Debian 12)配置jupyter与R 语言的融合

融合前&#xff1a; 服务器端Debian 12,域名&#xff1a;www.leyuxy.online 1.安装r-base #apt install r-base 2.进入R并安装IRkernel #R >install.packages(“IRkernel”) 3.通过jupyter notebook的Terminal执行&#xff1a; R >IRkernel::installspec() 报错 解决办…

【Godot4.2】2D导航01 - AStar2D及其使用方法

概述 对于2D平台跳跃或飞机大战&#xff0c;以及一些直接用键盘方向键操控玩家的游戏&#xff0c;是根本用不到寻路的&#xff0c;因为只需要检测碰撞就可以了。 但是对于像RTS或战棋这样需要操控玩家到地图指定位置的移动方式&#xff0c;就绝对绕不开寻路了。 导航、碰撞与…