二分查找
二分查找
lowerBound(nums, target)
核心要素
- 注意区间开闭,三种都可以
- 循环结束条件:当前区间内没有元素
- 下一次二分查找区间:不能再查找(区间不包含) $mid$,防止死循环
- 返回值:大于等于 $target$ 的第一个下标(注意循环不变量)
有序数组中二分查找的四种类型(下面的转换仅适用于数组中都是整数)
- 第一个大于等于 $x$ 的下标: $lowerBound(nums, x)$
- 第一个大于 $x$ 的下标:可以转换为 第一个大于等于 $x+1$ 的下标,即 $lowerBound(nums,x+1)$
- 最后一个小于 $x$ 的下标:可以转换为 第一个大于等于 $x$ 的下标的左边位置, 即 $lowerBound(nums,x) - 1$;
- 最后一个小于等于 $x$ 的下标:可以转换为 第一个大于等于 $x+1$ 的下标的左边位置, 即 $lowerBound(nums,x+1) - 1$;
闭区间写法
1 | private int lowerBound(int[] nums, int target) { |
左闭右开区间写法
1 | // 左闭右开区间写法 |
开区间写法
1 | // 开区间写法 |
左闭右闭二分
1 | // 查找左边界 >= target |
1 | // 查找右边界 <= target |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 byu_rself!
评论