• 二分总结


    二分总结

    标签: 二分


    情况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
Copyright © 2020-2023  润新知