按条件查找:

查找序列中第一个大于等于x元素的位置

  • 如果A[mid] >= x, 即 x 可能在 mid 或 mid的左侧, right = mid;
  • 如果A[mid] < x, left = mid - 1;

按条件的二分查找与直接二分查找有几点不同:
1.循环条件,left < right, 不是 left <= right, 因为寻找第一个大于等于 x的元素,不需要必须判读x是否存在,就算 x 在序列中并不存在,返回的结果应是"假设 x 存在,它在序列中的位置".
2.由于当 left == right,循环结束,返回的结果可能是left或right.
3.二分查找的上界,n, 因为可能出现,x,比有序序列中的所有元素都大,所以返回结果应该是n,(假设 x存在,x 应该排列的位置).

#include <iostream>
using namespace std;int lower_bound(int a[], int x, int left, int right) {int mid;while(left < right) {  //left = right,退出循环,找到xmid = (left + right)/2;if (a[mid] >= x)right = mid;elseleft = mid + 1;}return left;
}int main() {int A[10] = {1, 2, 3, 4, 4, 4, 5, 6, 7, 8};int x;cin >>x;cout<<lower_bound(A, x, 0, 10);return 0;
}

查找一个序列中第一个大于x元素的位置

#include <iostream>
using namespace std;int upper_bound(int a[], int x, int left, int right) {int mid;while(left < right) {mid = (left + right)/2;if (a[mid] > x)right = mid;elseleft = mid + 1;}return left;
}int main() {int A[10] = {1, 2, 3, 4, 4, 4, 5, 6, 7, 8};int x;cin >>x;cout<<upper_bound(A, x, 0, 10);return 0;
}

左开右闭写法

(left, right],循环条件while(left + 1 < right), 对于下标为0的序列,left = -1, right = n;

#include <iostream>
using namespace std;int upper_bound(int a[], int x, int left, int right) {int mid;while(left+1 < right) {mid = (left + right)/2;if (a[mid] > x)right = mid;elseleft = mid;}return right;
}int main() {int A[10] = {1, 2, 3, 4, 4, 4, 5, 6, 7, 8};int x;cin >>x;cout<<upper_bound(A, x, -1, 10);return 0;
}

假设有序序列中有一些重复元素x,查找 x的区间

举个例子:A = {1, 3, 3, 3, 6};, 返回 [1, 4];

#include <iostream>
using namespace std;int lower_bound(int a[], int x, int left, int right) {int mid;while(left < right) {mid = (left + right)/2;if (a[mid] >= x)right = mid;elseleft = mid + 1;}return left;
}int upper_bound(int a[], int x, int left, int right) {int mid;while(left < right) {mid = (left + right)/2;if (a[mid] > x)right = mid;elseleft = mid + 1;}return left;
}
int main() {int A[10] = {1, 2, 3, 4, 4, 4, 5, 6, 7, 8};int x;cin >>x;int l = lower_bound(A, x, 0, 10);int r = upper_bound(A, x, 0, 10);cout<<'['<<l<<','<<r<<']'<<endl;return 0;
}
4
[3,6]

algorithm 中已经集成了这些函数

#include <iostream>
#include <algorithm>
using namespace std;int main() {int A[10] = {1, 2, 3, 4, 4, 4, 5, 6, 7, 8};int x;cin >>x;int * l = lower_bound(A, A+10, x);int * r = upper_bound(A, A+10, x);cout<<'['<<l - A<<','<<r - A<<']'<<endl;return 0;
}
4
[3,6]

二分从查找(2)按条件查找相关推荐

  1. 【Excel高效工作3】VLOOKUP函数实例使用(二):精确匹配进阶——反向查找,多条件查找 / 模糊匹配的使用

    本章内容: 上一章用实例展示了VLOOKUP函数最基本的功能:精确匹配 的基础用法.然而,实际工作中对我们提出的需求会更高,面对某些更加复杂的情况,我们可能需要对Excel表格数据先进行预处理,再使用 ...

  2. vlookup(精确查找、区间查找、反向查找、多条件查找)

    一.基本语法 VLOOKUP(查找的值,查找范围,返回列数,查找方式) 查找的值 内容需完全一样: 查找范围 待查找的必须是数据范围的第一列(比如,要查找货品的数量,我们查的是货品,那么货品必须是查找 ...

  3. Excel查找函数之Vlookup多条件查找

    上次跟大家分享了vlookup的简单查找.区间查找.交叉查找,这次我们来学下vlookup的多条件查找. 多条件查找 根据多条件查找 =VLOOKUP(F2&G2,IF({1,0},B2:B1 ...

  4. Java有序表查找:折半查找、二分查找、差值查找和斐波那契查找

    Java有序表查找:折半查找.二分查找.差值查找和斐波那契查找     [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51 ...

  5. 查找算法-(顺序查找、二分查找、插值查找、斐波那契查找)

    1)顺序查找或叫线性查找 就是顺序遍历匹配 2)二分查找 package search;public class BinarySearch {/*** 二分查找数组必须有序*//**** @param ...

  6. 查找算法--01 顺序查找和二分查找

    目      录 1. 顺序查找 1.1 顺序查找介绍 1.2 顺序查找适用范围 1.3 顺序查找代码实现 2.二分查找 2.1 二分查找介绍 2.2 二分查找适用范围 2.3 二分查找代码实现 2. ...

  7. 查找算法之二分查找(对半查找)

      当有序表采用顺序存储时,可以采用二分查找的方式查找指定关键字的元素.   二分查找的基本思想是选择表中某一位置 i i i的元素 A i A_i Ai​,设该元素的关键字为 K i K_i Ki​ ...

  8. C语言之二分查找法或折半查找法剖析(经典例题,经典解析)

    二分查找法(也叫折半查找法): 什么是二分查找? 具体查找的方式? 两种方法剖析 易错点列举 先举例题: int arr[]={1,2,3,4,5,6,7,8,9,10}; 找出7所在的位置. 分析之 ...

  9. excel 多条件查找三种方法:lookup、vlookup、indexmatch 多条件查找案例

    最近在Excel微信学习交流群中收到某位学员的问题咨询,问题是如何返回单据编号和物料长代码对应的含税数额.如下表: 其实这位学员的问题就是excel的多条件查找问题. 下面通过一个实例跟大家分享一下常 ...

  10. 【python基础】list操作相关:扩充、条件查找【IndexError: list assignment index out of range】...

    参考 [https://blog.csdn.net/qq_44768814/article/details/88614393] [IndexError: list assignment index o ...

最新文章

  1. Spring Boot + MDC 实现全链路调用日志跟踪
  2. 官宣:神策 2018 数据驱动大会亮点回顾
  3. 【Node.js】编码实现目录浏览服务
  4. MySQL sysdate()函数 不走索引的问题
  5. Spring对JNDI的支持方法
  6. 什么是常驻内存式的开发模式?_“直播+”模式下的直播系统开发需要注意什么问题?...
  7. url 特殊字符 传递参数解决方法
  8. CentOS7安装MySQL初始密码设置:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password:
  9. 简答如何做项目的测试经理!!!
  10. 大漠插件7.2137
  11. 90后马来西亚女孩闯华为
  12. spo0lsv病毒分析
  13. JAVA-ApplicationContext的使用
  14. input内容右对齐_STM32学习笔记—DAC基础内容及常见问题
  15. Q_UNUSED()函数的作用
  16. 贝勒大学计算机专业,贝勒大学计算机科学.pdf
  17. 导航条形式 转自百度UEO
  18. MySql-基础查询与排序
  19. Scyther工具形式化分析Woo-Lam协议
  20. php dsa算法,openssl_private_encrypt使用DSA算法生成的密钥无法加密

热门文章

  1. git push 报错提示 ! [rejected] dev -> dev (non-fast-forward)
  2. 阿里架构10年,头条开发2年,我终于写出了一套Java核心知识点!
  3. 懒人用日志分析-awstats的docker应用
  4. webpack的详细使用
  5. 无线WIFI上网监控串联部署方案
  6. Nodejs express中创建ejs项目,解决express下默认创建jade,无法创建ejs问
  7. redis缓存Hash操作的在主数据中的应用
  8. D3D 扎带 小样本
  9. Mysql 时间戳类型使用心得
  10. Google Maps API 中的标注编程