【学习笔记】数据结构 二分查找(二分查找模板+边界处理+查找区间+旋转数组)

一、二分查找模板

模板 1:左闭右闭 left, right

区间含义:left 和 right 都代表能取到的有效下标

模板2:左闭右开 [left, right)

right 是取不到的边界,数组长度作为初始 right

二、边界处理重点

1、mid 计算:mid = left + (right-left)/2,不要写(left+right)/2,left+right过大时会整数溢出

2、循环条件判断

left,right:left <= right,左右相等时区间还有一个元素,仍然要判断

[left,right):left < right,left 等于 right 区间就空了

3、更新左右指针

如果 mid 位置的值不是 target,mid 一定要排除在外

目标在右边:left = mid +1

目标在左边:right = mid -1(闭区间模板)

4、适用场景:普通查找、找左边界、找右边界(找第一个 / 最后一个满足条件的元素)

三、旋转有序数组知识点

概念:原本升序数组,在某个点旋转,分成两段有序子数组,例如 4,5,6,7,0,1,2

特点:局部有序,整个数组不是完全有序,但其中一半一定是有序的。

二分思路:判断 mid 左边还是右边是有序区间,看 target 是否落在有序区间内,再收缩区间。

重点:

1、每次取 mid,先判断左半段 left,mid 是否有序

2、如果左半有序:判断 target 是否在numsleft ≤ target < numsmid,是就去左边,否则去右边

3、如果右半有序:判断 target 是否在numsmid < target ≤ numsright,是就去右边,否则去左

4、注意:数组存在重复元素时,无法判断哪边有序,需要right--缩小范围(进阶)

相关推荐
kkkkkkkkkk_Z1 小时前
学嵌入式和Linux应用编程|学习日记:深入理解TCP协议与网络编程实战
linux·笔记·学习
小刘在重生~1 小时前
十六(3)、《集合扩充》CopyOnWriteArrayList 超详细解析(线程安全集合)
java·笔记·面试·职场和发展
传奇开心果编程1 小时前
【Go入门练中学】第1课:从零开始
后端·学习·golang
维克兜率天2 小时前
5.3 宏观因子:抬头看天
笔记·python·深度学习·算法·量化
LuminousCPP2 小时前
数据结构-排序(五):计数排序与排序专题阶段总结|从外部归并到线性排序,再看算法边界与选型
c语言·数据结构·笔记·算法·排序算法
钓鱼的肝2 小时前
csp-j-s总结(1)
c++·笔记·算法·青少年编程
The Chosen One9852 小时前
OS第二章随手记(2.1)
linux·运维·服务器·笔记
志尊宝2 小时前
Vue3 零基础每日笔记(030):动态组件与 keep-alive——切换组件与页面缓存
笔记·vue·html·前端开发·软件开发
东方芷兰2 小时前
Agent 技术摘要 02 —— 区块链、比特币、挖矿、ETF、比特币疯涨事件、以太坊、以太币、显卡荒事件
人工智能·笔记·python