二分总结

二分总结

标签: 二分


情况1,找到第一个大于q的节点(找到最后一个小于等于q的位置-1)
手写代码:左指针始终指向小于等于q的节点,右指针是种指向大于q的节点,结束条件是l和r相邻。最后返回r

int solve(int q, int n)
{
    int l = 0, r = n-1;
    int mid;
    while(r-l>1)
    {
        mid = (l+r)/2;
        if(mp[mid]<=q) l = mid;
        else {
            r = mid;
        } 
    }
    return r;
}

std中调用的函数为

upper_bound(mp,mp+n,q)-mp;
最后一定要减去开始位置。因为返回的是指针。

情况2,找到第一个大于等于q的节点(找到最后一个小于q的位置+1)
手写代码:考虑第一个大于等于q的节点,那么有l始终指向小于它的位置,r始终指向大于等于它的位置

int solve(int q, int n)
{
    int l = 0; 
    int r =n-1;
    int mid;
    while(r-l>1){
        mid = (l+r)/2;
        if(mp[mid]<q) l = mid;
        else   r = mid;
    }
    return r;
}

也可以直接调用函数

    lower_bound(mp,mp+n,q)-mp;

情况3,找第一个等于的,用第二个方法得出的结果判断。

原文地址:https://www.cnblogs.com/shanyr/p/5956872.html