二分及其变体详解

笑话引入.png

二分查找作者:思路简单,细节魔鬼

1 二分查找框架

框架.png

分析二分查找的一个技巧是:不要出现 else,而是把所有情况用 else if 写清楚,这样可以清楚地展现所有细节

1.1 mid需要防止溢出

计算机中的计算可能会造成整型溢出从而变成负数————计算结果太大导致符号位发生不正常改变。

  • 如何避免?
    int mid = lo + (hi - lo) / 2;
1.2 寻找一个数
代码.png
  • 细节
    1)为什么while条件是小于等于
    因为:对于闭区间的搜索,当区间只有一个数时候也要判断一次;
    2)为什么left = mid+1,right=mid-1
    因为:mid已经搜索过了
    3)这个算法有什么缺陷?
    如果有序数组中存在重复元素,想得到最左边或最右边的target是不可行的。
    下面来讨论这两种情况:
1.3 寻找左侧边界的二分搜索
代码.png
  • 细节
    1)为什么条件变成小于了?
    因为:本次搜索的是左闭右开区间,此时终止条件位left==right,【left,left)为空,可以正确终止。
    2)为什么没有返回-1的操作?如果nums不存在target怎么办?
    因为:代表返回值小于target的元素个数


    2).png

    3)为什么left=mid+1,right=mid?
    因为:区间是左闭右开的。
    4)为什么这个算法可以搜索左侧边界?
    搜索到target时候,right=mid,缩小上届。


    4).png
1.4 寻找右侧边界的二分搜索

同理:


image.png
  • 细节:
    1)为什么能找到右侧边界


    image.png

    2)
    image.png

    3)
    image.png
1.5 总结
image.png

你可能感兴趣的:(二分及其变体详解)