算法基础--二分

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.mzph.cn/news/791285.shtml

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

相关文章

pdf图片识别分类

文章目录 解析pdf数据ocr识别分类方法分类完提示 解析pdf数据 试了几种方法 fitz-get_image后面方法不适用&#xff0c;用pixmap分辨率低 用pypdf2版本低方法用不了 用pdf2image还要下依赖工具 用spire.pdf的SaveAsImage分辨率低&#xff0c;ExtractImages可以但运行慢 先用sp…

动手做一个最小Agent——TinyAgent!

Datawhale干货 作者&#xff1a;宋志学&#xff0c;Datawhale成员 前 言 大家好&#xff0c;我是不要葱姜蒜。在ChatGPT横空出世&#xff0c;夺走Bert的桂冠之后&#xff0c;大模型愈发地火热&#xff0c;国内各种模型层出不穷&#xff0c;史称“百模大战”。大模型的能力是毋…

非阻塞connect的正确使用方式

问题 在使用非阻塞connect时&#xff0c;发现在服务端没有运行时&#xff0c;连接成功&#xff0c;发现是对于connect返回为-1时&#xff0c;对错误码没有做正确的处理&#xff0c;只是对于errno为EINTR做了处理&#xff0c;其它错误码时使用select判断是否可写&#xff0c;可…

字符分类函数

字符分类函数 C语言中有⼀系列的函数是专门做字符分类的&#xff0c;也就是⼀个字符是属于什么类型的字符的。这些函数的使用都需要包含⼀个头文件是 ctype.h 这些函数的使用方法非常类似&#xff0c;我们就讲解⼀个函数的事情&#xff0c;其他的非常类似&#xff1a; int i…

图的应用解析

01&#xff0e;任何一个无向连通图的最小生成树(B )。 A.有一棵或多棵 B.只有一棵 C.一定有多棵 D.可能不存在 02.用Prim算法和Kruskal算法构造图的最小生成树&#xff0c…

内存和网卡压力测试

1.内存压力测试 1.1测试目的 内存压力测试的目的是评估开发板中的内存子系统性能和稳定性&#xff0c;以确保它能够满足特定的应用需求。开发板通常用于嵌入式系统、物联网设备、嵌入式智能家居等场景&#xff0c;这些场景对内存的要求通常比较高。 其内存压力测试的主要目的…

开发板通过Ethernet(以太网口)与笔记本相连,并通过笔记本wifi连接手机热点来访问外网

文章目录 1、连接开发板与笔记本&#xff1a;2、配置笔记本的网络共享&#xff1a;3、配置开发板的网络设置&#xff1a;4、验证网络连接&#xff1a; 1、连接开发板与笔记本&#xff1a; 使用一根网线将开发板的Ethernet接口与笔记本的以太网口相连。 2、配置笔记本的网络共…

【深度学习】sdwebui的token_counter,update_token_counter,如何超出77个token的限制?对提示词加权的底层实现

文章目录 前言关于token_counter关于class StableDiffusionProcessingTxt2Img(StableDiffusionProcessing)如何超出77个token的限制&#xff1f;对提示词加权的底层实现Overcoming the 77 token limit in diffusers方法1 手动拼方法2 compel 问询、帮助请看&#xff1a; 前言 …

Linux系统切割文件和合并文件介绍

split 和 cat 是 Linux 系统中用于文件切割和合并的命令。它们可以用于将大文件分割成多个小文件&#xff0c;或者将多个小文件合并成一个大文件。 1. split 命令用于将一个大文件切割成多个小文件。它的基本语法如下&#xff1a; split [-a num][-d][-l num][file][prefix] 其…

JS 数组方法 slice 和 splice 的区别

1. slice 概述 slice 方法用于提取数组中的一部分&#xff0c;返回提取结果&#xff0c;不会改变原数组 语法 array.slice(start, end)start 起始位置 end 可选参数&#xff0c;结束位置返回值: 起始位置到结束位置之间的数据&#xff0c;包含起始位置&#xff0c;但是不包含…

动规训练2

一、最小路径和 1、题目解析 就是一个人从左上往做下走&#xff0c;每次只能往右或者往下&#xff0c;求他到终点时&#xff0c;路径上数字和最小&#xff0c;返回最小值 2、算法原理 a状态表示方程 小技巧&#xff1a;经验题目要求 用一个二维数组表示&#xff0c;创建一个…

Flask Python:数据库多条件查询,flask中模型关联

前言 在上一篇Flask Python:模糊查询filter和filter_by&#xff0c;数据库多条件查询中&#xff0c;已经分享了几种常用的数据库操作&#xff0c;这次就来看看模型的关联关系是怎么定义的&#xff0c;先说基础的关联哈。在分享之前&#xff0c;先分享官方文档,点击查看 从文档…

蓝桥杯算法基础(36)动态规划dp经典问题详解

动态规划 -动态规划方法方法代表了这一类问题&#xff08;最优子结构or子问题最优性&#xff09;的有一半解法&#xff0c;是设计方法或者策略&#xff0c;不是具体算法 -本质是递推&#xff0c;核心是找到状态转移的方式&#xff0c;写出dp方程 -形式:记忆性递归递推01背包问题…

FreeRTOS中断管理以及实验

FreeRTOS中断管理以及实验 继续记录学习FreeRTOS的博客&#xff0c;参照正点原子FreeRTOS的视频。 ARM Cortex-M 使用了 8 位宽的寄存器来配置中断的优先等级&#xff0c;这个寄存器就是中断优先级配置寄存器 &#xff0c; STM32寄存器中并且这个寄存器只使用[7:4]&#xff0c…

Rust 中的字符串类型:`str` 和 `String`

Rust 中的字符串类型&#xff1a;&str 和 String 文章目录 Rust 中的字符串类型&#xff1a;&str 和 String1. &str&#xff1a;不可变的字符串引用2. String&#xff1a;可变的字符串3、字符串使用综合案例代码执行结果 在 Rust 编程语言中&#xff0c;有两种主要…

RTX RTOS 操作实例分析之---线程(thread)

0 Preface/Foreword 1 线程&#xff08;thread&#xff09; 1.1 线程定义 1.1.1 USE_BASIC_THREADS&#xff08;宏定义&#xff09; 经过以上步骤&#xff08;makefile包含&#xff09;&#xff0c;USE_BASIC_THREADS在编译阶段被定义到相应的模块中。 1.1.2 定义线程ID变量…

安装Pillow库的方法最终解答!_Python第三方库

安装Python第三方库Pillow 我的环境&#xff1a;Window10&#xff0c;Python3.7&#xff0c;Anaconda3&#xff0c;Pycharm2023.1.3 pillow库 Pillow库是一个非常强大的图像处理库。它提供了广泛的图像处理功能&#xff0c;让我们可以轻松地读取和保存图像、创建缩略图和合并到…

Java学习day5-面向对象2

构建标准JavaBean快捷方式 快捷键&#xff1a;altinsert(Fn)->构造函数->全选构造带参方法&#xff0c;不选择则空参构造 插件&#xff1a;ptg,安装后右键单击&#xff0c;倒数第三个则为一键构造所有set/get函数 数据类型 基本数据类型&#xff1a;数据值存储在自己的…

欧拉路径欧拉回路

欧拉回路&#xff0c;指遍历图时通过图中每条边且仅通过一次&#xff0c;最终回到起点的一条闭合回路&#xff0c;适用于有向图与无向图&#xff0c;如果不强制要求回到起点&#xff0c;则被称为欧拉路径。 欧拉图&#xff1a;具备欧拉回路的图 无向图&#xff1a;图的所有顶…

代码随想录 Day37 738.单调递增的数字 968.监控二叉树

738.单调递增的数字 class Solution { public:int monotoneIncreasingDigits(int N) {string strNum to_string(N);// flag用来标记赋值9从哪里开始// 设置为这个默认值&#xff0c;为了防止第二个for循环在flag没有被赋值的情况下执行int flag strNum.size();for (int i s…