二分查找求上界和下界
二分查找求上界和下界
假设序列有序,其区间为[left,right)[left, right),设middlemiddle为区间中间值,现在需要获得首个出现元素vv的位置,如果不存在,返回一个位置,在此插入vv,序列仍然有序,则可以通过以下方式求出:
- if middle位置的值 = v:至少已经找到一个,左边可能还有,则区间变为[left,middle][left, middle]。
- if middle位置的值 > v:所求位置不可能在后面,但可能是middle,则区间变为[left,middle][left, middle]。
- if middle位置的值 < v:middle和前面都不可行,则区间变为[middle+1,right][middle + 1, right]。
求下界算法实现
// 二分查找求下界
int lowerBound(int *a, int lef, int righ, int v) {int middle;while(lef < righ) {// 取中值middle = lef + (righ - lef) / 2;if(v <= a[middle]) {righ = middle;} else {lef = middle + 1;}}return lef;
}
同理也可以求出上界,因为[x,y)[x,y)左闭右开,返回的将是它出现的最后一个位置的下一个位置,不存在的情况和下界一样。
求上界算法实现
// 二分查找求上界
int upperBound(int *a, int lef, int righ, int v) {int middle;while(lef < righ) {// 取中值middle = lef + (righ - lef) / 2;if(v >= a[middle]) {lef = middle + 1;} else {righ = middle;}}return lef;
}
测试主程序
#include <iostream>using namespace std;// 二分查找求下界
int lowerBound(int *a, int lef, int righ, int v) {int middle;while(lef < righ) {// 取中值middle = lef + (righ - lef) / 2;if(v <= a[middle]) {righ = middle;} else {lef = middle + 1;}}return lef;
}// 二分查找求上界
int upperBound(int *a, int lef, int righ, int v) {int middle;while(lef < righ) {// 取中值middle = lef + (righ - lef) / 2;if(v >= a[middle]) {lef = middle + 1;} else {righ = middle;}}return lef;
}int main() {int a[] = {-10, -5, 0, 0, 1, 3, 3, 3, 5, 10};int n = 10;int v = -100;cout << "元素" << v << "在a中的下界位置是:" << lowerBound(a, 0, n, v) << endl;v = -10;cout << "元素" << v << "在a中的下界位置是:" << lowerBound(a, 0, n, v) << endl;v = 0;cout << "元素" << v << "在a中的下界位置是:" << lowerBound(a, 0, n, v) << endl;v = 3;cout << "元素" << v << "在a中的下界位置是:" << lowerBound(a, 0, n, v) << endl;v = 10;cout << "元素" << v << "在a中的下界位置是:" << lowerBound(a, 0, n, v) << endl;v = 100;cout << "元素" << v << "在a中的下界位置是:" << lowerBound(a, 0, n, v) << endl;cout << endl << endl;v = -100;cout << "元素" << v << "在a中的上界位置是:" << upperBound(a, 0, n, v) << endl;v = -10;cout << "元素" << v << "在a中的上界位置是:" << upperBound(a, 0, n, v) << endl;v = 0;cout << "元素" << v << "在a中的上界位置是:" << upperBound(a, 0, n, v) << endl;v = 3;cout << "元素" << v << "在a中的上界位置是:" << upperBound(a, 0, n, v) << endl;v = 10;cout << "元素" << v << "在a中的上界位置是:" << upperBound(a, 0, n, v) << endl;v = 100;cout << "元素" << v << "在a中的上界位置是:" << upperBound(a, 0, n, v) << endl;return 0;
}
输出数据
元素-100在a中的下界位置是:0
元素-10在a中的下界位置是:0
元素0在a中的下界位置是:2
元素3在a中的下界位置是:5
元素10在a中的下界位置是:9
元素100在a中的下界位置是:10元素-100在a中的上界位置是:0
元素-10在a中的上界位置是:1
元素0在a中的上界位置是:4
元素3在a中的上界位置是:8
元素10在a中的上界位置是:10
元素100在a中的上界位置是:10Process returned 0 (0x0) execution time : 1.609 s
Press any key to continue.
二分查找求上界和下界相关推荐
- 二分查找(上界,下界)
// 普通二分查找 int bsearch(int *A, int l, int r, int val){ // [l, r)while(l < r){int mid = l + (r - l) ...
- 二分查找、求上界和下界(包括内置函数lower_bound、和upper_bound的使用)
二分查找: //二分查找(迭代实现) int bsearch(int* array, int low, int high, int index) {int mid;while (low < hi ...
- 算法--二分查找--求平方根(循环法/递归法)
二分查找: 数据需要是顺序表(数组) 数据必须有序 可以一次排序,多次查找:如果数据频繁插入,删除操作,就必须保证每次操作后有序,或者查找前继续排序,这样成本高,二分查找不合适 数据太小,不用二分查找 ...
- 二分查找求最大值用master公式
- 二分查找法的实现和应用汇总
此文转自:http://www.cnblogs.com/ider/archive/2012/04/01/binary_search.html 在学习算法的过程中,我们除了要了解某个算法的基本原理.实现 ...
- 878. 第 N 个神奇数字(二分查找+数学)| 1819. 序列中不同最大公约数的数目(枚举+数学)
878. 第 N 个神奇数字 一个正整数如果能被 a 或 b 整除,那么它是神奇的. 给定三个整数 n , a , b ,返回第 n 个神奇的数字.因为答案可能很大,所以返回答案 对 109 + 7 ...
- 程序员面试金典 - 面试题 17.08. 马戏团人塔(最长上升子序 DP/二分查找)
文章目录 1. 题目 2. 解题 2.1 超时解 2.2 二分查找 1. 题目 有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上.出于实际和美观的考虑,在上面的人要比下面的人矮一点且轻一 ...
- 关于二分查找及其上下界问题的一些思考
个人认为在编程的时候,我的代码能力应该是到位的,但是昨天参加的某公司笔试彻底把这个想法给终结了,才意识到自己是多么的弱.其中印象最深刻的是一道关于二分查找上下界的问题.当时洋洋得意,STL 分分钟搞定 ...
- CSP认证201703-4 地铁修建[C++题解]:连通路径上的最大边权最小、bfs求边权为1的最短路、二分查找
文章目录 题目解答 题目链接 题目解答 来源:acwing 分析: 题目给定n个点和m条边,要求最多选择n条边,使得1到n连通,然后每段路同时开工,求最小工时.换句话说,求的是连通路上最大边权最小. ...
最新文章
- Java深入了解String对象
- 10.5做题——全排列(初赛复习)
- 元素、属性、标题、段落、文本格式化
- 推荐!入门人工智能必看的45篇论文(文末下载)
- pytorch 实现线性回归
- vue报错:error Strings must use singlequote quotes 字符串必须使用单引号
- Yii防注入***笔记
- 职场潜规则:公司出现这三种信号,你必须果断辞职!
- MySQL全文索引Match Against与Like比较
- Centos7 Kubernetes(k8s) 开发服务器(单服务器)部署 prometheus 监控
- Python密码生成器
- Xposed框架未安装解决方法
- 算法设计与分析期末复习
- led点阵c语言程序,LED点阵C语言程序
- php 将图片裁剪成圆形图片,[PHP]把图片切成圆形
- c语言中min函数的作用,min函数到底在哪个头文件里?
- 有一部电影用计算机回到未来,《复联4》调侃《回到未来》,1985年的这部穿越片,到底讲了什么...
- 【MOOC】计算机网络与通信技术笔记(北交)(3)数据链路层
- PHP下载文件(laravel)
- IDEA相同变量高亮显示
热门文章
- 安卓加java完成登录_从零学习安卓自动化(java+appium方向):完成登录操作+一个主流程(四)...
- .NetCore+WebUploader实现大文件分片上传
- 关于EFCore线程内唯一
- C#开发笔记之11-如何用C#过滤连续相同的字符串?
- reddit_Reddit如何大规模构建功能:采访其工程副总裁
- 给它一个REST:对您的API使用GraphQL
- 金融时间序列计算分析题1
- Python3网络爬虫开发实战,IP代理池的维护
- Python3 装饰器解析
- Django框架——视图