L2_二分查找

https://algorithm.yuanbin.me/zh-hans/basics_algorithm/binary_search.html

二分里等于的那个头,start或者end,后面后判断。因为等于了还被移动,答案就在另一半了。

binary search 模板
//first occurrence of target
int binarySearch(vector<int> &A, int target){
    if(A.size()==0){
        return -1;
    }
    int start=0;
    int end=A.size()-1;
    int mid;
    while(start+1<end){
        mid=start+(end-start)/2;
        if(A[mid]==target)
            end=mid;
        else if(A[mid]>target)
            end=mid; //不用mid+1之类
        else
            start=mid;
    }
//Mid不变,所以最后需要分别判断
    if(A[start]==target)
        return start;
    if(A[end]==target)
        return end;
        
    return -1;
}

二分花花模板,最后返回的L要按条件调整

Bisect

核心区别

方法
返回值位置
当元素存在时
当元素不存在时
相等元素处理

bisect_left

插入位置在最左边

返回第一个等于x的位置

返回应该插入的位置

所有相等元素左边

bisect_right

插入位置在最右边

返回最后一个等于x的位置+1

返回应该插入的位置

所有相等元素右边

面试中如何选择

使用 bisect_left 的情况

  1. 查找元素是否存在(替代in操作)

    pythonCopy

  2. 寻找第一个≥x的元素

    pythonCopy

  3. 需要精确位置时

    • 如区间问题中找不重叠的最后一个区间

  4. 实现有序集合

    • 保证相同元素插入位置一致

使用 bisect_right 的情况

  1. 计算元素出现次数

    pythonCopy

  2. 寻找最后一个≤x的元素

    pythonCopy

  3. 需要插入到重复元素之后

    • 如维护按时间排序的日志,新事件插入到相同时间事件的末尾

记忆技巧

  1. "Left"联想:

    • 左边界 → 第一个等于x的位置

    • 如C++中的lower_bound

  2. "Right"联想:

    • 右边界 → 最后一个等于x的位置+1

    • 如C++中的upper_bound

  3. 插入场景想象:

    • bisect_left插入后元素在相同值的最前面

    • bisect_right插入后元素在相同值的最后面

Last updated

Was this helpful?