二分查找求上界和下界

假设序列有序,其区间为[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.

二分查找求上界和下界相关推荐

  1. 二分查找(上界,下界)

    // 普通二分查找 int bsearch(int *A, int l, int r, int val){ // [l, r)while(l < r){int mid = l + (r - l) ...

  2. 二分查找、求上界和下界(包括内置函数lower_bound、和upper_bound的使用)

    二分查找: //二分查找(迭代实现) int bsearch(int* array, int low, int high, int index) {int mid;while (low < hi ...

  3. 算法--二分查找--求平方根(循环法/递归法)

    二分查找: 数据需要是顺序表(数组) 数据必须有序 可以一次排序,多次查找:如果数据频繁插入,删除操作,就必须保证每次操作后有序,或者查找前继续排序,这样成本高,二分查找不合适 数据太小,不用二分查找 ...

  4. 二分查找求最大值用master公式

  5. 二分查找法的实现和应用汇总

    此文转自:http://www.cnblogs.com/ider/archive/2012/04/01/binary_search.html 在学习算法的过程中,我们除了要了解某个算法的基本原理.实现 ...

  6. 878. 第 N 个神奇数字(二分查找+数学)| 1819. 序列中不同最大公约数的数目(枚举+数学)

    878. 第 N 个神奇数字 一个正整数如果能被 a 或 b 整除,那么它是神奇的. 给定三个整数 n , a , b ,返回第 n 个神奇的数字.因为答案可能很大,所以返回答案 对 109 + 7  ...

  7. 程序员面试金典 - 面试题 17.08. 马戏团人塔(最长上升子序 DP/二分查找)

    文章目录 1. 题目 2. 解题 2.1 超时解 2.2 二分查找 1. 题目 有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上.出于实际和美观的考虑,在上面的人要比下面的人矮一点且轻一 ...

  8. 关于二分查找及其上下界问题的一些思考

    个人认为在编程的时候,我的代码能力应该是到位的,但是昨天参加的某公司笔试彻底把这个想法给终结了,才意识到自己是多么的弱.其中印象最深刻的是一道关于二分查找上下界的问题.当时洋洋得意,STL 分分钟搞定 ...

  9. CSP认证201703-4 地铁修建[C++题解]:连通路径上的最大边权最小、bfs求边权为1的最短路、二分查找

    文章目录 题目解答 题目链接 题目解答 来源:acwing 分析: 题目给定n个点和m条边,要求最多选择n条边,使得1到n连通,然后每段路同时开工,求最小工时.换句话说,求的是连通路上最大边权最小. ...

最新文章

  1. Java深入了解String对象
  2. 10.5做题——全排列(初赛复习)
  3. 元素、属性、标题、段落、文本格式化
  4. 推荐!入门人工智能必看的45篇论文(文末下载)
  5. pytorch 实现线性回归
  6. vue报错:error Strings must use singlequote quotes 字符串必须使用单引号
  7. Yii防注入***笔记
  8. 职场潜规则:公司出现这三种信号,你必须果断辞职!
  9. MySQL全文索引Match Against与Like比较
  10. Centos7 Kubernetes(k8s) 开发服务器(单服务器)部署 prometheus 监控
  11. Python密码生成器
  12. Xposed框架未安装解决方法
  13. 算法设计与分析期末复习
  14. led点阵c语言程序,LED点阵C语言程序
  15. php 将图片裁剪成圆形图片,[PHP]把图片切成圆形
  16. c语言中min函数的作用,min函数到底在哪个头文件里?
  17. 有一部电影用计算机回到未来,《复联4》调侃《回到未来》,1985年的这部穿越片,到底讲了什么...
  18. 【MOOC】计算机网络与通信技术笔记(北交)(3)数据链路层
  19. PHP下载文件(laravel)
  20. IDEA相同变量高亮显示

热门文章

  1. 安卓加java完成登录_从零学习安卓自动化(java+appium方向):完成登录操作+一个主流程(四)...
  2. .NetCore+WebUploader实现大文件分片上传
  3. 关于EFCore线程内唯一
  4. C#开发笔记之11-如何用C#过滤连续相同的字符串?
  5. reddit_Reddit如何大规模构建功能:采访其工程副总裁
  6. 给它一个REST:对您的API使用GraphQL
  7. 金融时间序列计算分析题1
  8. Python3网络爬虫开发实战,IP代理池的维护
  9. Python3 装饰器解析
  10. Django框架——视图