算法基础--二分

news2024/10/11 16:24:34

img

😀前言
二分查找是一种常见的算法技巧,通过不断缩小搜索范围,快速找到目标值的算法。在实际应用中,二分查找可以应用于有序数组中的查找、求上界、求下界等问题,具有较高的效率和广泛的应用价值。

🏠个人主页:尘觉主页

文章目录

  • 算法基础--二分
    • 二分简介
    • 整数二分步骤:
    • 入门例题
      • 二分查找一
      • 二分查找二
      • 二分查找三
    • 😄总结

算法基础–二分

二分简介

二分分为整数二分和实数二分两种,

整数二分步骤:

  1. 找一个区间[L, R],使得答案一定在该区间中
  2. 找一个判断条件,使得该判断条件具有二段性,并且答案一定是该二段性的分界点。
  3. 分析中点M在该判断条件下是否成立,如果
    (成立,考虑答案在那个区间。如果不成立,考虑答案在那个区间)
  4. 如果更新方式写的是R = Mid,则此时l=mid+1,这是mid更新方式是
    如果更新方式是l=mid;则mid=l+r+1>>1;c此时r=mid-1;

入门例题

二分查找一

蒜头君手上有个长度为 nn 的数组 AA。由于数组实在太大了,所以蒜头君也不知道数组里面有什么数字,所以蒜头君会经常询问整数 xx 是否在数组 AA 中。

输入格式
第一行输入两个整数 nn 和 mm,分别表示数组的长度和查询的次数。

接下来一行有 nn 个整数 a_ia
i

接下来 mm 行,每行有 11 个整数 xx,表示蒜头君询问的整数。

输出格式
对于每次查询,如果可以找到,输出"YES",否则输出"NO"。

数据范围
1≤n,m≤1e5 0≤x≤1e6

输出时每行末尾的多余空格,不影响答案正确性

样例输入复制
10 5
1 1 1 2 3 5 5 7 8 9
0
1
4
9
10
样例输出复制
NO
YES
NO
YES
NO

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;
const int N=1e5+10;
int num[N];
int n,m;

int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++)cin>>num[i];
    sort(num,num+n);
    while(m--){
        int t;
        cin>>t;
        int l=0,r=n-1;
        while(l<r){
            int mid=l+r>>1;    
            if(num[mid]>=t){
                r=mid;
            }else{
                l=mid+1;
            }
        }
        if(num[l]!=t){
            cout<<"NO"<<endl;
        }else{
            cout<<"YES"<<endl;
        }
    }
    
    
    return 0;
}

二分查找二

蒜头君手上有个长度为 nn 的数组 AA。由于数组实在太大了,所以蒜头君也不知道数组里面有什么数字,所以蒜头君会经常询问在数组 AA 中,大于等于 xx 的最小值是多大?

输入格式
第一行输入两个整数 nn 和 mm,分别表示数组的长度和查询的次数。

接下来一行有 nn 个整数 a_ia
i

接下来 mm 行,每行有 11 个整数 xx,表示蒜头君询问的整数。

输出格式
对于每次查询,如果可以找到,输出这个整数。

否则输出 -1。

数据范围
1≤n,m≤1e5 0≤x≤1e6

输出时每行末尾的多余空格,不影响答案正确性

样例输入复制
10 5
1 1 1 2 3 5 5 7 8 9
0
1
4
9
10
样例输出复制
1
1
5
9
-1

题解

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;
const int N=1e6+10;
int n,m;
int num[N];
int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++)cin>>num[i];
    sort(num,num+n);
    while(m--){
        int t;
        cin>>t;
        int l=0,r=n-1;
        while(l<r){
            int mid=l+r>>1;
            if(num[mid]>=t){
                r=mid;
            }else{
                l=mid+1;
            }
        }
        if(num[l]>=t){
            cout<<num[l]<<endl;
        }else{
            cout<<-1<<endl;
        }
    }
    
    return 0;
}

二分查找三

蒜头君手上有个长度为 nn 的数组 AA。由于数组实在太大了,所以蒜头君也不知道数组里面有什么数字,所以蒜头君会经常询问在数组 AA 中,比 xx 大的最小值是多大?但是这次蒜头君要求这个数字必须大于 xx,不能等于 xx。

输入格式
第一行输入两个整数 nn 和 mm,分别表示数组的长度和查询的次数。

接下来一行有 nn 个整数 a_ia
i

接下来 mm 行,每行有 11 个整数 xx,表示蒜头君询问的整数。

输出格式
对于每次查询,如果可以找到,输出这个整数。

否则输出 -1−1。

数据范围
1≤n,m≤1e5 0≤x≤1e6

输出时每行末尾的多余空格,不影响答案正确性

样例输入复制
10 5
1 1 1 2 3 5 5 7 8 9
0
1
4
9
10
样例输出复制
1
2
5
-1
-1

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;
const int N=1e6+10;
int n,m;
int num[N];
int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++)cin>>num[i];
    
    sort(num,num+n);
    
    while(m--){
        int t;
        cin>>t;
        int l=0,r=n-1;
        while(l<r){
            int mid=l+r>>1;
            if(num[mid]>t){
                r=mid;
            }else{
                l=mid+1;
            }
        }
        if(num[l]>t){
            cout<<num[l]<<endl;
        }else{
            cout<<-1<<endl;
        }
    }
    return 0;
}

😄总结

通过本文的介绍和例题演示,我们深入了解了整数二分查找的基本原理及应用方法。在解决具体问题时,首先要确定查找区间和判断条件,然后利用二分思想不断缩小区间范围,最终得到答案。同时,我们也学习了如何处理特殊情况,如查找大于等于某一值的最小值,以及查找严格大于某一值的最小值等情况。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

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

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

相关文章

scoped原理及使用

一、什么是scoped&#xff0c;为什么要用 在vue文件中的style标签上&#xff0c;有一个特殊的属性&#xff1a;scoped。 当一个style标签拥有scoped属性时&#xff0c;它的CSS样式就只能作用于当前的组件&#xff0c;通过该属性&#xff0c;可以使得组件之间的样式不互相污染。…

C# 登录界面代码

背景 MVVM 是一种软件架构模式&#xff0c;用于创建用户界面。它将用户界面&#xff08;View&#xff09;、业务逻辑&#xff08;ViewModel&#xff09;和数据模型&#xff08;Model&#xff09;分离开来&#xff0c;以提高代码的可维护性和可测试性。 MainWindow 类是 View&a…

网络协议——VRRP(虚拟路由冗余协议)原理与配置

1. VRRP概述 单网关出现故障后下联业务中断&#xff0c;配置两个及以上的网关时由于IP地址冲突&#xff0c;导致通讯时断时续甚至通信中断。VRRP组播类的网络层协议 2. 协议版本 VRRP v2: 支持认证,仅适用于IPv4网络 VRRP v3: 不支持认证&#xff0c; 适用于IPv4和IPv6两种网…

ES学习日记(九)-------logstash导入数据

一、安装和下载 es官网下载地址 官方介绍:Logstash是开源的服务器端数据处理管道&#xff0c;能够同时从多个来源采集数据&#xff0c;转换数据&#xff0c;然后将数据发送到您最喜欢的“存储库”中。(我们的存储库当然是 Elasticsearch。) 下载和ES一样的版本(很重要,必须这…

适配器: stack与queue

模板的使用 容器的复用 传容器: 控制底层是那个控制传仿函数: 控制大小堆的建立 stack 特点: 后进先出底层: 容器的封装(vector, list, dequeue)场景: 模拟递归, 函数压栈等接口:empty(), size(), top(), push(), pop()代码: stack queue 特点: 先进先出底层: 容器的封装…

Linux中的shell脚本之流程控制循环遍历

3 条件判断 4 流程控制语句 1&#xff09;if 语句 案例&#xff0c;用户输入用户名和密码&#xff0c;判断用户名是否是admin,密码是否是123,如果正确&#xff0c;则显示登录成功 首先我创建了shell文件&#xff0c;touch getpawer 其中getpawer 是我自己命的名 #!/bin/bas…

基于SpringBoot的药品管理系统设计与实现

介绍 药品管理员&#xff1a; 登录、退出、药品信息录入、药厂信息录入、采购人信息录入、药品信息浏览、药厂信息浏览、采购人信息浏览、药品信息查询入库修改删除、药信息查询修改删除采购人信息查询修改删除、入库记录浏览出库记录浏览、系统帮助 取药处人员: 登录、退出、…

[源码] Android 上的一些快捷方式,如通知、快捷方式等

目录 一、通知0. 配置权限1. 测试发送通知代码2. 打开通知设置界面代码3. 前台服务创建常驻通知 二、快捷方式1. 测试添加动态快捷方式代码 三、开发者图块四、桌面小部件 基于jetpack compose 框架的使用代码 一、通知 参见 官方文档 0. 配置权限 <uses-permission andr…

Matlab梁单元有限元编程:铁木辛柯梁VS欧拉梁

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

PTA题解 --- 天梯赛的赛场安排(C语言)

今天是PTA题库解法讲解的第八天&#xff0c;今天我们要讲解天梯赛的赛场安排&#xff0c;题目如下&#xff1a; 解题思路&#xff1a; 这个问题的关键在于高效地为参赛学校的队员分配赛场&#xff0c;同时满足给定的条件。我们可以通过以下步骤解决这个问题&#xff1a; 存储每…

[C#]OpenCvSharp使用HoughCircles霍夫圆检测算法找出圆位置并计数

【效果展示】 原图&#xff1a; 找出位置&#xff1a; 【测试环境】 vs2019,netframework4.7.2,opencvsharp4.8.0 【函数用法】 cv2提供了一种圆检测的方法&#xff1a;HoughCircles。该函数的返回结果与参数设置有很大的关系。 检测的图像时9枚钱币&#xff0c;分别使用了…

fiverr是什么?fiverr续费订阅充值教程?

一、什么是Fiverr Fiverr是国际上非常有名的自由职业在线平台&#xff0c;汇聚了大大小小200多个类别的超过80万的自由职业者&#xff0c;网站用户活跃度非常高&#xff0c;发展至今也已经成为一个全球性外包服务平台。Fiverr最初是由Micha Kaufman和Shai Wininger于2010年创立…

注意力机制篇 | YOLOv8改进之添加LSKAttention大核卷积注意力机制 | 即插即用,实现有效涨点

前言:Hello大家好,我是小哥谈。LSKAttention是一种注意力机制,它在自然语言处理领域中被广泛应用。LSKAttention是基于Transformer模型中的Self-Attention机制进行改进的一种变体。在传统的Self-Attention中,每个输入序列中的元素都会与其他元素进行交互,以获取全局的上下…

fastadmin学习08-查询数据渲染到前端

index.php查询&#xff0c;这个是前台的index.php public function index() {$slideImgs Db::name("slideimg")->where("status",,normal)->limit(5)->order(sort,desc)->select();$productList Db::name("product")->where(…

AI绘画:Stable Diffusion的高效操作界面,ComfyUI:安装和使用篇

前言 Stable Diffusion&#xff08;简称SD&#xff09;是一款强大的AI绘画工具&#xff0c;通常通过Web UI操作界面进行使用。然而&#xff0c;对于那些寻求更高效率和个性化工作流的用户来说&#xff0c;ComfyUI提供了一个基于节点流程的操作界面&#xff0c;使得工作流定制更…

【现代控制】线代基础

连续系统 连续系统状态空间离散化 其中&#xff1a;

Go——函数

一. 函数定义 1.1 特点 无需声明原型支持不定变参支持多返回值支持命名返回参数支持匿名函数和闭包函数也是一种类型&#xff0c;一种函数可以赋值给变量不支持嵌套&#xff0c;一个包不能有两个名字一样的函数不支持重载不支持默认参数 1.2 函数声明 函数声明包含一个函数名&…

【ESP32S3 Sense接入语音识别+MiniMax模型+TTS模块语音播报】

【ESP32S3 Sense接入语音识别MiniMax模型TTS模块语音播报】 1. 前言2. 功能模块概述2.1 语音接入2.2 大模型接入2.3 TTS模块接入 3. 先决条件3.1 环境配置3.2 所需零件3.3 硬件连接步骤 4. 核心代码4.1 源码分享4.2 代码解析 5. 上传验证5.1 对话测试5.2 报错 6. 总结 1. 前言 …

Zabbix6 - Web管理网络拓扑/端口流量监控配置手册

Zabbix6 - Web管理网络拓扑/端口流量监控配置手册 概述: 1)Zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 Zabbix由两部分构成,Zabbix Server与可选组件Zabbix Agent。通过C/S模式采集数据,通过B…

element-ui divider 组件源码分享

今日简单分享 divider 组件&#xff0c;主要有以下两个方面&#xff1a; 1、divider 组件页面结构 2、divider 组件属性 一、组件页面结构 二、组件属性 2.1 direction 属性&#xff0c;设置分割线方向&#xff0c;类型 string&#xff0c;horizontal / vertical&#xff0…