c++二分查找

C++算法——二分法查找 本章介绍了二分查找的算法思想,并且整理了相关的经典题目,从简单到难的去逐步递进,并且提供了链接和描述,可以直接通过链接去练习,或者直接看本篇博客去尝试思考解题,还提供了参考的思路,部分困难的题目会结合图像去分析,还有测试通过的参考代码 阅读详情

二分查找

1.概念

二分查找,又称折半查找(Binary search),是一种高效的查找方法
查找之前一定要保证这个数列是升序排列过的
查找过程:
①将序列中间位置的元素与查找关键字(结果)比较,如果两者相等,则查找成功,退出
②利用中间位置将原来序列分成前后两个子序列
③只选择其中一个子序列继续查找:若中间位置的元素大于查找关键字,查找前一子序列,反之亦然
④重复以上1~3过程,直到找到满足条件的元素,查找成功,或者直到子序列不再存在为止,查找失败(无结果)
二分查找要求(条件):
①序列必须采用顺序结构存储
②序列必须有序(按某关键字大小有序排列)
话不多说,先来例题

2.例题

2.1 二分查找基础版

2.1.1 题目

二分查找:
输入N个序数(N <= 10^6)从小到大,使用二分查找给定数M是否存在,如果有该数,则从左到右输出第一次出现的位置(计数从1开始),如果没有这样的数输出0。
输入:
第一行和整数 n, m
n 个整数的第二行
输出:
m 第一次出现的位置。如果没有这样的数字,则输出 0。
示例输入:
7 4
1 2 4 4 5 7 9
示例输出:
3

2.1.2 分析

这是最基础的二分查找,我们以在1~100的升序序列中查找31为例:
第一步:
找到中间,选择前面的子序列
第二步:
再次寻找中间,选择后面的子序列
第三步:
再次寻找中间,选择前面的子序列
第四步:
再次寻找中间,找到元素,查找结束
图片还是非常直观的~我们不多废话,上代码

2.1.3 代码
#include<bits/stdc++.h>
using namespace std;
int a[1000001],n,num;
int main(){
	scanf("%d",&n);
	scanf("%d",&num);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	int left=1,right=n,mid;
	while(left<right){
		mid=(left+right)/2;
		if(num>a[mid]){
			left=mid+1;
		}
		else if(num<a[mid]) {
			right=mid-1;
		}
		else{
			right=mid;
		}
	}
	if(a[left]!=num){
		cout<<"0";
	}
	else{
		cout<<left;
	}
	return 0;
}

注意数组大小哦,不然会RE!

2.2 二分查找-变形一

2.2.1 题目

二分查找输入N(N<=10^6)个从小到大的有序数,用二分查找第一个大于M的数的位置。
输入格式:
第一行而个整数n,m;第二行n个整数
输出格式:
第一个大于M的数的位置
样例输入1:
5 3
1 2 4 4 5
样例输出1:
3
样例输入2:
5 5
1 2 4 4 5
样例输出2:
6
时间限制:
1000
空间限制:
65536

2.2.2 分析

这道题目和上一道题只有一点点区别,后面不需要判断了,直接输出left即可

2.2.3 代码
#include<bits/stdc++.h>
using namespace std;
int a[1000001],n,m;
int main(){
	scanf("%d",&n);
	scanf("%d",&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	int left=1,right=n+1,mid;
	while(left<right){
		mid=(left+right)/2;
		if(m==a[mid]){
			left=mid+1;
		}
		else if(a[mid]>m){
			right=mid;
		}
		else{
			left=mid+1;
		}
	}
	cout<<left;
	return 0;
}

2.3 查找最接近的元素

2.3.1 题目

题目描述:
在一个非降序列中,查找与给定值最接近的元素
输入:
第1行包含两个整数,一个整数n(1<=n<=1,000,000),为非降序列长度,一个整数m,表示要询问最接近元素的给定值。给定值的大小均在0~1,000,000,000之间。
第2行包含n个整数,表示序列的各个元素。所有元素的大小均在0~1,000,000,000之间。
输出:
为最接近相应给定值的元素值,若有多个值满足条件,输出最小的一个。
输入样例:
4 7
2 5 9 10
输出样例:
5

2.3.2 代码
#include<bits/stdc++.h>
using namespace std;
int a[1000001],n,num;
int main(){
	scanf("%d",&n);
	scanf("%d",&num);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	int ans=INT_MAX,sum,j;
	for(int i=1;i<=n;i++){
		sum=abs(num-a[i]);
		if(sum<ans){
			j=i;
			ans=sum;
		}
	}
	cout<<a[j];
	return 0;
}

制作不易,点个赞吧😘

c++详解二分查找 第四步,也是最重要的一步:我们首先判断这个数是大于a[mid]还是小于a[mid],因为数组已经有序,如果大于说明a[mid]项以下包括a[mid]都不可能是value。我们就不考虑mid项以下的情况了,就把left左指针更改为mid+1(mid不可能是我们找的那个数)。对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近。第三步:编写结束条件,如果a[mid]==value就说明找到了,返回位置,也就是mid。 阅读详情

相关推荐

C/C++分治算法(1)——二分查找

常见分治算法总结(1)二分查找 一篇文章,带你搞懂 二分查找(注:代码语言的选择不应该限制了我们对算法的理解) 文章附有动图!一看就懂!

青春无问西东 岁月自成芳华 3万+

C++算法:二分查找(Binary Search)

在枚举查找里,要一个不漏的查找完所有数据,最坏情况下时间复杂度为O(n)。这就导致程序的时间消耗非常巨大,若a数组的最大下标为1000000,则程序也需要查找1000000次,很容易导致TLE(Time Limit Exceeded)。那么有没有一种更快捷的方法呢? 当然有,这就是二分查找法(Binary Search),想象一下,对于一个无序数列,我们当然只能枚举,但如果是一个有序数列,那么在查找的过程中就会有迹可循。

fk__boy的博客 6596

C++中自带的二分查找函数

C++的头文件algorithm中有用于二分查找的函数,分别为lower_bound()、upper_bound()以及binary_search(): lower_bound():返回大于或等于目标值的第一个位置 upper_bound():返回大于目标值的第一个位置 binary_search():若目标值存在则返回true,否则返回false 这三个函数都有三个参数:分别为数组的起始位置、数组的终止位置(取不到)以及要查找的目标值,返回值为物理地址,因此要获得对应的逻辑地址,需要减去数组的起始位置

学习永无止境 1万+

C++二分查找(最全)

大家好!今天我们一起来学习C++之二分查找~~~有的人会说:“哎呀!我不理解什么叫二分查找呢!有的人会说:“我已经会了,为什么还要看这篇博客呢?没事,别着急,无论是会还是不会,这篇博客既可以帮不会的人学懂,也可以帮会的人复习,请不要划走!今天分为5个板块:1.什么叫“二分查找?2.“二分查找”的缺是什么?3.“二分查找”怎么实现?4.“二分查找”易错的地方在哪?5.今天的作业是什么?(下一篇博客讲解)

weixin_72909426的博客 2341

C++二分查找

c++二分

Archie28的博客 2051

c++二分查找法

二分查找法是从区间[i,j]上连续不断将sum(a)·sum(b)&amp;lt;0的函数ans=sum(x),通过循环实现把函数sum(x)的0点所在区间一分为二,如此循环,使区间[i,j]的两个端点逐渐像0点靠近,得到0点近似值的方法。可以实现空间优化,适用于数据较大的题目。时间复杂第O(log(2n))。 在使用c++的二分查找法,要先将数据排序,二分查找法的基本思想可以这样总结:我们设数据是按升序...

Konnyaku 1915

二分查找cpp

#include <iostream> #include <vector> using std::cout; using std::endl; template <typename T> int binary_search(const std::vector<T>& list, const int& item) { int...

ailinyingai的博客 502

C++二分查找算法

包括:二分查找的原理,证明,及样例。 分四类:自己写二分算法 有序映射 对有序向量二分查找 有序集合

闻缺陷则喜何志丹 2973

cpp的stl二分查找库函数

cout << "第一个大于或等于 " << target << " 的元素是: " << *it << endl;cout << "第一个大于或等于 " << target << " 的元素是: " << *lower << endl;"是" : "否") << endl;cout << "第一个大于 " << target << " 的元素是: " << *it << endl;cout << "第一个大于 " << target << " 的元素是: " << *upper << endl;

2302_80145725的博客 749

深度学习优化算法解析(Momentum, RMSProp, Adam)

之前看了很多人介绍网络的优化器optimizer,无奈很多都把简单的东西讲的复杂化了,不容易让人懂,恰好之前看过吴恩达老师的最新的课程,这里结合老师讲的和个人想法写一下,方便别人同时也为自己以后回顾吧。 深度学习的优化算法主要有GD,SGD,Momentum,RMSProp和Adam算法吧,还有诸如Adagrad算法,不过大同小异,理解了前面几个,后面的也就引刃而解了。GD算法,SGD算法以及m

willduan的博客 12万+

基于深度残差U-Net与多尺度注意力机制的医学图像分割系统

本文提出了一种创新的医学图像分割系统,通过融合残差连接、通道注意力机制和空间金字塔池化技术,构建了高性能的UResnet分割网络。系统采用编码器-解码器架构,创新性地引入多层次特征增强模块,显著提升了医学图像中复杂组织结构的分割精度。实验结果表明,该方案在多个医学图像数据集上均取得了优异性能,边界分割精度提升15%,训练收敛速度提升30%,同时减少20%计算量。系统为临床诊断提供了可靠的技术支持,未来可扩展至3D医学图像分割和联邦学习等方向。

Henry的博客 814

C++实现二分查找

二分查找(Binary Search)是一种在有序数组中查找特定元素的算法。它的基本思想是将待查找区间的中间元素与目标值进行比较,根据比较结果缩小查找范围,直到找到目标值或者确定目标值不存在为止。

Chinese_chen_的博客 724

【大模型微调】魔搭社区GPU进行LLaMA-Factory微调大模型自我认知

本教程介绍如何使用魔搭社区GPU资源和LLaMA-Factory工具进行大模型微调。主要内容包括环境配置、工具安装、模型训练和效果评估。通过LoRA算法进行自我认知微调,详细说明了从数据准备到模型导出的完整流程,并提供了参数调优和显存管理等实用技巧,帮助读者快速掌握大模型定制化训练方法。

LChuck的博客 2929

c++ 二分查找

如果要搜索的值大于中间元素,则在数组的右半部分继续搜索。通过不断缩小搜索范围,最终可以在O(log n)的时间复杂度内找到目标元素,是一种高效的搜索算法。二分查找通常是用于在有序数组中查找数值类型的数据,而不是用于在字符串数组中查找字符串。但是,如果你需要在有序的字符串数组中查找特定的字符串,你可以自定义比较函数来进行二分查找。这段代码演示了一个简单的二分查找函数,用于在一个有序的字符串数组中查找特定的目标字符串。这段代码演示了一个简单的二分查找函数,用于在一个有序整数数组中查找特定的目标值。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 983

【大模型】大模型知识蒸馏 综述解读(Knowledge Distillation of Large Language Models)

知识蒸馏的(论文)方法总结。归纳了通过数据(如指令、对话、多模态)和训练方法(SFT、RL、数据增强),将复杂技能(如对齐、工具使用、多模态)蒸馏到开源模型的核心框架,附典型模型示例(如Alpaca、LLaVA)。

songxia928_928的博客 4336

Android开发中StateFlow与LiveData的5个关键区别及实战避坑指南

本文深度解析了Android开发中StateFlow与LiveData的5个核心区别,包括设计哲学、生命周期管理、值更新策略、线程模型及协程生态整合。通过实战代码对比,为开发者在现代MVVM架构下的状态管理选型提供清晰的决策指南和避坑建议,帮助构建更健壮、可测试的应用。

weixin_29012677的博客 405

二分查找 c++

二分法:理解十分的容易,但就是一学就会,一写就废,总会把区间问题搞错,进而导致最后的结果不对。

2301_79411185的博客 2103

化工模拟与优化软件:Aspen HYSYS二次开发_(15).工业应用与项目管理

项目背景、目标和主要流程。

kkchenjj的博客 1131

C++ 二分查找

已知一个排序数组A,如A=[-1,2,5,20,90,100,207,800] 另外一个乱序数组B,如B=[50,90,3,-1,207,80] 求B中的任意某个元素,是否在A中出现,出现用1代表,未出现用0代表。 用递归法二分查找: #include<vector> bool binary_search(std::vector<int> &sort_array, ...

weixin_44208324的博客 216

手把手教你使用 YOLOv11/v8 算法 + PaddleOCR 算法完成车牌检测和车牌识别系统,AI智能体,毛玻璃系统,包括PaddlePaddle安装、数据集预处理、模型训练、AI大模型应用等

手把手教你使用 YOLOv11/v8算法 + PaddleOCR算法完成车牌检测和车牌识别系统,AI智能体,毛玻璃系统,包括PaddlePaddle安装、数据集预处理、模型训练、AI大模型应用等。车牌识别系统支持 蓝牌、绿牌、黄牌、双层车牌等车牌识别。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2786

实战|mitmproxy+Playwright 拦截篡改Cloudflare验证流程,实现无感爬取(2026实测可用)

2026年对抗Cloudflare,别再死磕滑块、轨迹、算法。高伪装浏览器 + 中间层劫持篡改验证流程Playwright + mitmproxy = 无感过CF这篇是纯实战、无废话、可直接上线的方案。你只要把目标网站、cf_clearance填进去,就能跑通。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1284

C++算法学习专题:二分查找

算法思路:利用二段性1、先查找区间左端点x<t时,left=mid+1,[left,right]x>=t时,right=mid,[left,right]细节处理:(1)循环条件left<right,原因如下:left=right的时候就是结果,不需要判断,判断就会陷入死循环(2)求重点的操作两种求法:区别:数组为偶数的时候第一种为靠左的位置,第二种为靠右的位置极端情况下(如下)第二种方法就会死循环2、查找区间右端点x<=t时,left=mid,[left,right]

2401_89119815的博客 1099

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

stl解决二分查找cpp

cpp的stl中两个二分查找库函数的用法如下。代码如下(以1为开始的下标)

2302_80145725的博客 257

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: c++分治
下一篇: 递归-放橘子(c++)
sync_async
博客等级 码龄4年 5粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值