BinarySearch
使用二分的条件(整数二分、浮点数二分)
有单调性一定可以二分
能用二分解的题不一定具有单调性
有上下界
解题 3 步骤
预处理:如果集合未排序,则进行排序
二分查找:使用循环或递归在每次比较后将查找空间二分
先定义搜索区间
根据搜索区间定义循环结束条件
取中间元素和目标元素做对比(目标元素可能是需要找的元素或者是数组第一个/最后一个元素等)
根据比较的结果收缩区间,舍弃非法解
后处理:在剩余空间中确定可行的候选者
常见变体
如果存在多个满足条件的元素,返回最左边满足条件的索引
如果存在多个满足条件的元素,返回最右边满足条件的索引
数组不是整体有序的,比如先升序再降序,或者先降序再升序
将一维数组变成二维数组
。。。
framework
很多人喜欢拿整型溢出的 bug 说事儿,但是二分查找真正的坑根本就不是那个细节问题,而是在于到底要给 mid 加一还是减一,while 里到底用 <= 还是 <

分析二分查找代码时,最好不要出现 else,全部展开成 else if 方便理解
注意「搜索区间」和 while 的终止条件,如果存在漏掉的元素,记得在最后检查
如需定义左闭右开的「搜索区间」搜索左右边界,只要在
nums[mid] == target时做修改即可,搜索右侧时需要减一如果将「搜索区间」全都统一成两端都闭,好记,只要稍改
nums[mid] == target条件处的代码和返回的逻辑即可
some templates
1 Basic Template
2 查找第一个值等于给定值的元素(左边界)
3 查找最后一个值等于给定值的元素(右边界)
4 查找第一个大于等于给定值的元素
5 查找最后一个小于等于给定值的元素
6 寻找左侧边界的二分搜索(labuladuo version)
7 寻找右侧边界的二分搜索(labuladuo version)
questions
Last updated