常见 二分查找

经典问题:

在一个严格递增序列中A找到给定的数x的下标

令[left,right]为整个序列的下标区间,每次测试比较预查询的x与中间位置A[mid]的大小

1.若x == A[mid] 说明查找成功,返回mid

2.若x < A[mid] 说明x在mid的左侧,因此right = mid-1;

3.若x > A[mid] 说明x在mid的右侧,因此left = mid + 1;

循环的条件为left <= right

当然若A序列为递减,同理。

值得注意的是:若二分查找上界超过int类型范围的一半,并且预查询元素在序列靠后的位置,mid = (left+right)/2 很可能超过int而导致溢出。因此mid 可以写成 mid = left + (right-left)/2

进一步的问题:

若递增序列A中的元素允许重复,那么对于给定的预查询元素x,求出序列中第一个大于等于x元素的位置。

与之前的查找类似,不过在条件上有些许不同

1.若x == A[mid] 那么第一个大于等于x的元素的范围肯定在[left,mid]

2.若x > A[mid] 范围在[mid+1,right]

3.若x < A[mid] 范围在[left,mid],这个得注意,可以举个例子[3,5,8]x = 4,A[mid] = 5,那么第一个大于等于x应该是5

该问题的循环条件是left < right 而不是left <= right,对于该问题想要返回第一个大于等于x的元素的位置,不需要判断元素x本身是否存在,因此只需[left,right] left==right时就会刚好夹出唯一的位置,因此条件为left <right

这里可以将数组a[n]的输入为[0,n],那么当x大于数组的所有元素[0~n-1],那么就输出n,表示没有该元素。

相关推荐
一方热衷.1 小时前
YOLO26-Seg ONNXruntime C++/python推理
开发语言·c++·python
炽烈小老头2 小时前
【每天学习一点算法 2026/03/08】相交链表
学习·算法·链表
HalvmånEver3 小时前
7.高并发内存池大页内存申请释放以及使用定长内存池脱离new
java·spring boot·spring
凤山老林3 小时前
SpringBoot 使用 H2 文本数据库构建轻量级应用
java·数据库·spring boot·后端
一碗白开水一3 小时前
【工具相关】OpenClaw 配置使用飞书:打造智能飞书助手全流程指南(亲测有效,放心享用)
人工智能·深度学习·算法·飞书
仰泳的熊猫3 小时前
题目2194:蓝桥杯2018年第九届真题-递增三元组
数据结构·c++·算法
Tisfy3 小时前
LeetCode 1888.使二进制字符串字符交替的最少反转次数:前缀和O(1)
算法·leetcode·字符串·题解
2301_803554523 小时前
linux 以及 c++编程里对于进程,线程的操作
linux·运维·c++
赶路人儿3 小时前
UTC时间和时间戳介绍
java·开发语言
dreamread3 小时前
【SpringBoot整合系列】SpringBoot3.x整合Swagger
java·spring boot·后端