浅谈c++中upper_bound与lower_bound的用法

lower_bound和upper_bound详解 阅读详情

神犇勿喷

         在我还是个蒟蒻的时候(现在还是哈),我在网上翻了几篇有关upper_bound和lower_bound的文章,结果发现我全都看不懂非常复杂,为了避免再有人重蹈覆辙,我就发了这篇粗制滥造简单易懂的水帖文章。

概念

upper_bound(a+m,a+n,b):二分查找a当中从m到n中大于b的第一项

lower_bound(a+m,a+n,b):二分查找a当中从m到n中大于等于b的第一项

各位看官是否发现,upper_bound和lower_bound在使用前务必!务必要进行排序!(这鬼发现的了啊)

我相信,任何未曾了解这两个函数的人,看到上面这段话都一脸懵逼非常明白了吧!所以,让我们有请——

例子

题目描述

给定一个大小为n的序列a,有q次询问,每次询问是下面两种的一种:

  1. 给定一个数x,询问序列a中大于等于x的最小的数是多少;
  2. 给定一个数x,询问序列a中大于x的最小的数是多少。

输入描述

第一行输入两个数n,q,第二行输入n个数,接下来q行每行两个数op,x,如果op=1则回答第一个询问,如果op=2则回答第二个询问。

输出描述

q行每行一个数表示答案。

样例输入

5 5

824723001 618600001 484313876 641601 863795305

2 443846913

1 508522161

1 54873761

2 938783233

1 862924124

样例输出

484313876

618600001

484313876

-1

863795305

数据范围

n=q=200000,1<=a[i]<=1e9,1<=x<=1e9

时空限制

2s,512M

这题怎么做呢,来,我们有请——

代码

#include<bits/stdc++.h>								//万能头 
using namespace std;
int a[200010];
int main()
{
	int n,q;
	scanf("%d%d",&n,&q);
	memset(a,-1,sizeof(a));
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	sort(a,a+n);									//这不用我说吧 
	for(int i=0;i<q;i++)
	{
		int op,x;
		scanf("%d%d",&op,&x); 
		if(op==1)
		{
			printf("%d\n",*lower_bound(a,a+n,x));	//求出a数组中第一个大于等于x的数的值 
		}
		else
		{
			printf("%d\n",*upper_bound(a,a+n,x));	//求出a数组中第一个大于x的数的值
		}
	}
	return 0;
}

我相信大家都能看懂这段代码,但是,是否有人注意到upper_bound和lower_bound前面的那个小小的” * “呢(肯定有啊),这就是我们今天的最后一个部分——

注意

upper_bound和lower_bound的返回值是一个指针,所以如果想要输出数据的值的话,需要加上取值运算符” * “。这时有的刁民看客就会问:那如何求出寻找到的数据的下标呢,很简单,来,上代码——

lower_bound(a,a+n,x)-a;
upper_bound(a,a+n,x)-a; 

只要在函数后面减去第一个参数,就可以得到下标了

如果你点赞的话,我会很高兴

(为什么没有人点赞!喵喵喵喵喵(恼怒中)! )

C++ lower_bound() upper_bound() 函数用法详解(深入了解,一文学会) find()、find_if()、search() 等。值得一提的是,这些函数的底层实现都采用的是顺序查找(逐个遍历)的方式,在某些场景中的执行效率并不高。例如,当指定区域内的数据处于有序状态时,如果想查找某个目标元素,更推荐使用二分查找的方法(相比顺序查找,二分查找的执行效率更高)。C++ STL标准库中还提供有 lower_bound()、upper_bound()、equal_range() 以及 binary_search() 这 4 个查找函数,它们的底层实现采用的都是二分查找的方式。 阅读详情

相关推荐

【C++】 详解 lower_bound 和 upper_bound 函数(看不懂来捶我!!!)

这两个函数是我在 LeetCode 上做题见到,看到不熟悉的函数 lower_bound 和 upper_bound让我感觉很难受,于是在C++ 官网去学习,例子就一个是最基础的,我看明白了。虽然是两个函数的接口就两个,但是有时候看别人使用的时候,里面参数还可以放不同的仿函数,我懵逼了。就去网上搜,但是大家讲解的都是它的第一个接口。我只能再把文档一遍一遍过,代码一遍遍的尝试,调试。最终通过查阅资料将其总结如下。

weixin_45031801的博客 9万+

lower_bound()/upper_bound()函数(C++)

lower_bound() / upper_bound()函数 : 简单介绍+详细分析+代码运行解析

psudd的博客 4505

单细胞双胞过滤-scrublet安装

pip install scrublet ----use-pep517有如下报错,分析可知安装annoy时不会自动更新gcc的版本,centos默认是4.8.5。pip install scrublet ----use-pep517 仍然报错,但似乎不影响使用,提示Successfully installed。打开终端,进入Python环境,输入以下代码,查看Python安装位置。暂时还没尝试是否存在问题,如果存在问题,降级scrublet版本。包的开发依赖的是比较低版本的numpy,会用到。

hzau_t的博客 792

upper_bound和lower_bound用法(史上最全)

相信我,比别人的全。

weixin_43967256的博客 1万+

DIY T12烙铁头驱动难题:用几个电容二极管,搞定NMOS上管驱动(附Multisim仿真)

本文详细介绍了如何利用电荷泵电路解决DIY T12烙铁头驱动中的NMOS上管驱动难题。通过巧妙组合电容和二极管,构建低成本高效的升压电路,实现栅极高压驱动需求。文章包含具体电路设计、元件选型建议、实际搭建注意事项以及Multisim仿真验证,为电子爱好者提供了一套完整的解决方案。

weixin_33640562的博客 334

数字后端实现Innovus教程之手把手教你N种高亮timing path和clock tree方法

数字IC后端设计实现Innovus教程之手把手教你N种高亮timing path和clock tree方法

weixin_37584728的博客 3596

入门二分查找——浅谈一些技巧

此时来到mid=(2+3)/2,即5/2,经过向下取整后,mid=2,答案不成立,因此l会来到3,再做一次取mid操作,此时mid=3,答案不成立。第二步:lower_bound(arr.begin(),arr.end(),value))---upper_bound(arr.begin(),arr.end(),value))即为答案。那么,我们如何解决这种问题呢?,5,7,8,6,2,2,1中,若要插入2,则第一次满足条件是在(4,2)之间,因此会返回2的地址。,例如在1,3,4,2,5,7,8,6,2,

2301_79933754的博客 1078

YOLO26 标签分配机制:STAL 小目标感知分配策略

YOLO26提出的STAL标签分配策略通过尺度感知机制优化了小目标检测性能。该方法根据目标面积将检测对象分为小、中、大三类,分别采用差异化的分配参数(TopK数量、IoU阈值和中心度权重),特别是对小目标采用更宽松的匹配条件和更高的中心度权重。实验结果表明,STAL策略显著提升了小目标检测精度(AP_small),同时保持了整体检测性能(mAP),为解决目标检测中尺度不平衡问题提供了有效方案。

一键难忘的博客 789

浅谈STL的set

引言: c++因为有了STL库所以变得比c语言简单了许多,许多容器不需要自己实现,但是自己必须要熟悉掌握。在STL中有各种你想要的容器及函数,在解决问题中用恰当的容器和函数会有事半功倍的效果。今天就要介绍一下c++最常用的容器之一set的相关操作。 什么是Set: set即集合,是按照特定顺序存储唯一元素的容器。(里面的元素是唯一的,不论你插入某元素几次)。集合中元素的值不能在容器中修改(元素始终为const),但可以将其插入容器或从容器中删除。 在内部,在所述元件组始终排序以下特定的严格弱排序标准表示通过

追梦少年ML的博客 368

全网首发--Unet3+改进16:在不同位置添加RepLKBlock超大卷积核

本文提出了一种基于大核卷积的神经网络架构RepLKNet,旨在缩小CNN与ViTs之间的性能差距。通过重新审视CNN中的大核设计,研究证明使用少量大卷积核替代多个小核能获得更强大的性能。提出的RepLKNet采用31×31大卷积核,在ImageNet和下游任务上取得了与SwinTransformer相当或更好的结果,同时具有更低延迟。文章详细介绍了实现步骤:(1)创建RepLKBlock模块文件;(2)在模型层中添加注意力机制;(3)在UNet模型中集成RepLKBlock;(4)完成训练流程。该方法展现了

AIcurator的博客 618

YOLOv8改进策略【卷积层】| GnConv:一种通过门控卷积和递归设计来实现高效、可扩展、平移等变的高阶空间交互操作

HorNet: 利用递归门控卷积实现高效高阶空间交互GnConv(Recursive Gated Convolution,递归门控卷积)

Limiiiing的博客 324

浅谈最长不下降子序列与最长上升子序列

  唔,最长不下降子序列与最长上升子序列曾是困扰蒟蒻多时的一个问题,应该也有一些人分不清这2个的求法吧。   首先n^2算法肯定是都能分清的,因为不下降和上升的区别是连续的2个能不能相等,只需要在判断的时候判一下是不是相等就可以了。   最长不下降子序列代码: 1 #include<iostream> 2 #include<cstdio> ...

alan133133的博客 261

基于Solidworks的三维光路结构示意图绘制实例演示-技术细节

基于Solidworks的三维光路结构示意图绘制实例演示-技术细节

简单光学 1万+

浅谈二分查找

如果我们有一个性质,能将一个区间划分成两部分,二分能将这个性质的边界求出来。

叶底藏花~的博客 316

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ACM暑假集训

浅谈二分二分查找什么是二分查找?二分查找的优缺点代码实现 二分查找 什么是二分查找? 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列,其实就是,对于要查找的元素,每次通过与区间的中间元素对比,不断缩小区间,直至查找到要查找的元素,或者左边大于右边(区间为0),至于什么是左边还是右边,各位看客容我慢慢道来。 二分查找的优缺点 优点:二分查找是一个常用的高效的查找算法,其时间复杂度O(logn) 我们假设

qq_45995244的博客 988

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

STL复杂算法

STL复杂算法浅谈 //复杂算法 #include #include #include #include #include #include using namespace std; #define N_COUNT 6 /* 以下函数 最后都默认使用operator<进行比较 自己也可以提供仿函数 都应用于有序区间 lower_bound(f,l,val); 返回小于val区间的下一个位置 迭代

张驴儿的博客 330

Statistics and Machine Learning Toolbox

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

【STL】C++标准模版库——set

01、目录 目录01、目录02、浅谈set03、关于set的几个思考3.1 为何map和set的插入删除效率比用其他序列容器高?3.2 为何每次insert之后,以前保存的iterator不会失效?3.3 当数据元素增多时,set的插入和搜索速度变化如何?04、set成员方法表05、set成员方法详细用法5.1 begin() 与 end()5.2 clear()5.3 empty()5.4 count()5.5 erase()5.6 equal_range()5.7 find()5.8 get_alloc

Cain Xcy的博客 479

C++——关于lower_bound( )和upper_bound( )的常见用法

原文链接:https://blog.youkuaiyun.com/qq_40160605/article/details/80150252    lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的。 在从小到大的排序数组中, lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于...

xiaonuolen 1万+

lower_bound和upper_bound的用法

二分查找算法可以解决最简单的二分查找问题:a数组单调递增,并且其中没有重复的数值。我们遇到的实际问题可能就没有这么简单,可能会有重复的数值。比如a数组里有3个5。这时我们查找5就有一个问题:到底返回哪一个5的下标? 为了解决这些问题,C++ STL提供了两个特别好用的函数:lower_bound()和uppper_bound()。假设a是一个数组,n是数组长度,lower_bound(a, a+n...

weixin_43534549的博客 1万+

C++ upper_bound()和lower_bound()(二分查找中使用)的定义,使用方法和区别

C++ upper_bound()和lower_bound()(二分查找中使用)的定义,使用方法和区别

Sansipi的博客 7266

lower_bound详解

lower_bound是C++标准模板库(STL)中的一个算法,用于在有序区间中查找第一个大于或等于给定值的元素的位置。自定义比较函数:除了使用默认的比较操作符外,我们还可以为lower_bound函数提供自定义的比较函数或Lambda表达式,以便根据特定的比较逻辑来查找元素。lower_bound 是 C++ 标准库中的一个算法,它在一个有序序列中查找第一个不小于(即大于或等于)给定值的元素,并返回该元素的迭代器。需要注意的是,由于二分查找算法的特性,lower_bound函数要求输入区间是有序的。

weixin_47772925的博客 1万+

C++ 折半查找之 lower_bound 和 upper_bound

C++ 折半查找之 lower_bound 和 upper_bound

qq_42303573的博客 7282

C++实现lower_bound、upper_bound函数

关于这个lower_bound、upper_bound函数我是在学习算法的时候有一个find函数需要去写,然后这个老师就没用库函数,直接写了这个底层实现,然后说这个可以用lower_bound替代,我就想这不就是个简单的二分嘛,然后我就好奇这个函数的底层源码,为此写了这篇博客。

weixin_60033897的博客 5411

三足鼎立 (25分) 2021年天梯赛模拟赛原题

题目 当三个国家中的任何两国实力之和都大于第三国的时候,这三个国家互相结盟就呈“三足鼎立”之势,这种状态是最稳定的。 现已知本国的实力值,又给出 n 个其他国家的实力值。我们需要从这 n 个国家中找 2 个结盟,以成三足鼎立。有多少种选择呢? 输入格式: 输入首先在第一行给出 2 个正整数 n(2 ≤ n ≤ 1 0 5 2≤n≤10^52≤n≤10 5 ​)和 P(P ≤ 1 0 9​​P≤10^9​​P≤10 9 ​​ ),分别为其他国家的个数、以及本国的实力值。随后一行给出 n 个正整数...

m0_51171995的博客 2918

(C++)upper_bound()和upper_bound()函数用法

最近接触了C++中的这两个函数,发现网上写的都不是很清楚,这里写一下他们的用法并且举两个例子。 函数的参数如下(这里摘自C语言中文网),这里的返回值返回的都是迭代器,最后一个比较函数可选,选了不同的比较函数带来的效果是完全不同的。这个比较函数的意思,上面也注明了,是查找不符合这个比较规则,当没有这个cmp函数的时候,默认的比较规则是小于,当然没有的时候可以不用太多思考,直接就是不小于和大于就行。 这两个函数本身的意思 lower_bound() 函数查找升序数组中大于等于(>=)

Hunter Dreamer的博客 7136
上一篇: c++数独(洛谷P1784)
下一篇: 初级动态规划(DP、背包)问题模板
智慧派蒙
博客等级 码龄5年 4粉丝 7原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值