C++STL中lower_bound() 和 upper_bound()二分查找

lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的。

通常用sort函数从小到大排序。

在从小到大的排序数组中,

lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

原文地址:https://www.cnblogs.com/transmigration-zhou/p/12275365.html

时间: 2024-10-08 01:28:51

C++STL中lower_bound() 和 upper_bound()二分查找的相关文章

C/C++-STL中lower_bound与upper_bound的用法以及cmp函数

转载于:http://blog.csdn.net/tjpuacm/article/details/26389441 不加比较函数的情况: [cpp] view plain copy int a[]={0,1,2,2,3}; printf("%d\n",lower_bound(a,a+5,2,cmp)-a); printf("%d\n",upper_bound(a,a+5,2,cmp)-a); 结果:2 4 lower的意义是对于给定的已经排好序的a,key最早能插入

STL函数 lower_bound 和 upper_bound 在算法竞赛中的用法

以前比较排斥这两个函数,遇到二分都是手写 \(while(left<=right)\). 这次决定洗心革面记录一下这两个函数的在算法竞赛中的用法,毕竟一般不会导致TLE. 其实百度百科已经概述得比较清楚了, 我们假设 \(value\) 为一个给定的数值, \(lower\_bound\) 是在一个升序序列中从前后后找第一个大于等于 \(value\) 的值, \(upper\_bound\) 是在一个升序序列中从前后后找第一个大于 \(value\) 的值. 比如:\(lower\_bound

剑指offer-面试题53_2-0~n-1中缺失的数字-二分查找

/* 题目: 寻找递增数组0~n-1中缺失的数字. */ /* 思路: 变形二分法. */ #include<iostream> #include<cstring> #include<vector> #include<algorithm> #include<map> using namespace std; int getMissingNumber(vector<int> &A, int n){ int start = 0;

lower_bound与upper_bound

lower_bound与upper_bound 1.作用 这两个是STL中的函数,作用很相似: 假设我们查找x,那么: lower_bound会找出序列中第一个大于等于x的数 upper_bound会找出序列中第一个大于x的数 没错这俩就差个等于号╮(╯▽╰)╭ 2.用法 以下都以lower_bound做栗子 (因为upper_bound做出的栗子不好吃) (其实就是我懒得打两遍) 它们俩使用的前提是一样的:序列是有序的 对于一个数组a,在[1,n]的区间内查找大于等于x的数(假设那个数是y),

uva 10763 Foreign Exchange(排序+二分查找)

这道题是我第一次算出来应该用什么复杂度写的题,或许是这一章刚介绍过,500000的数据必须用nlogn,所以我就 想到了二分,它的复杂度是logn,再对n个数据进行遍历,正好是nlogn,前两次TLE了,然后我就对我的做法没信心 了...看到一篇博客上说就应该这种方法,然后我就坚定的改自己的算法去了,哈哈,专注度没有达到五颗星,最多 三颗... 思路: 我用的是结构体保存的,先对每一对序列排序,然后对第二个元素在第一个元素中二分搜索,用到了 lower_bound,upper_bound,注释里

二分查找/折半查找算法

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功. class Pr

二分查找 模板

1 int bsearch(int l, int h, int k)//二分查找函数 2 { 3 int i, mid; 4 5 while(l<=h){ 6 mid = l+(h-l)/2; 7 if(X[mid]>k) 8 h = mid-1; 9 else if(X[mid]<k) 10 l = mid+1; 11 else 12 break; 13 } 14 return mid; 15 } 1 int max_bsearch(int l, int h, int k)//求上界

C++STL中set的使用策略(详解)

set的英文意思是“集合”, 集合都不陌生吧,集合的特点有唯一性,即:每一个元素只有一个,所以set可以用来“去重”操作,set还有默认的排序. 1.头文件——<set> 2.定义——set<int>Q; 3.输入(插入)——insert(x); 4.有序输出 set<int>::iterator it; for(it = Q.begin(); it != Q.end(); it++) cout<<*it<<endl; 5.删除制定元素——era

入门算法-二分查找,二分排序,插入排序,冒泡排序

1.二分查找(nlogn) 二分查找,需要将业务模拟一个有序数组.然后查找某个值在该数组中的位置. 二分查找的关键是: 1)查找的值一定在某次的范围中间.即使值是最后一个,也要按照二分法的规则去查找. 2)有左右边界的查找范围作为一个循环不变式 function bsearch(A, x) { // A 是有序升数组:x是待查值; 结果要返回x在A中的位置 // 循环不变式 let l = 0,r = A.length-1, guess; while(i <= r) { guess = Math