BinarySearch

使用二分的条件(整数二分、浮点数二分)

  1. 有单调性一定可以二分

  2. 能用二分解的题不一定具有单调性

  3. 有上下界

解题 3 步骤

  1. 预处理:如果集合未排序,则进行排序

  2. 二分查找:使用循环或递归在每次比较后将查找空间二分

    1. 先定义搜索区间

    2. 根据搜索区间定义循环结束条件

    3. 取中间元素和目标元素做对比(目标元素可能是需要找的元素或者是数组第一个/最后一个元素等)

    4. 根据比较的结果收缩区间,舍弃非法解

  3. 后处理:在剩余空间中确定可行的候选者

常见变体

  • 如果存在多个满足条件的元素,返回最左边满足条件的索引

  • 如果存在多个满足条件的元素,返回最右边满足条件的索引

  • 数组不是整体有序的,比如先升序再降序,或者先降序再升序

  • 将一维数组变成二维数组

  • 。。。

framework

很多人喜欢拿整型溢出的 bug 说事儿,但是二分查找真正的坑根本就不是那个细节问题,而是在于到底要给 mid 加一还是减一,while 里到底用 <= 还是 <

  1. 分析二分查找代码时,最好不要出现 else,全部展开成 else if 方便理解

  2. 注意「搜索区间」和 while 的终止条件,如果存在漏掉的元素,记得在最后检查

  3. 如需定义左闭右开的「搜索区间」搜索左右边界,只要在 nums[mid] == target 时做修改即可,搜索右侧时需要减一

  4. 如果将「搜索区间」全都统一成两端都闭,好记,只要稍改 nums[mid] == target 条件处的代码和返回的逻辑即可

some templates

1 Basic Template

2 查找第一个值等于给定值的元素(左边界)

3 查找最后一个值等于给定值的元素(右边界)

4 查找第一个大于等于给定值的元素

5 查找最后一个小于等于给定值的元素

6 寻找左侧边界的二分搜索(labuladuo version)

7 寻找右侧边界的二分搜索(labuladuo version)

questions

33.==搜索旋转排序数组==

34.在排序数组中查找元素的第一个和最后一个位置

69. ==x 的平方根==

81.搜索旋转排序数组 II

153.==寻找旋转排序数组中的最小值==

367.==有效的完全平方数==

Last updated