zoukankan      html  css  js  c++  java
  • 二分总结

    二分总结

    标签: 二分


    情况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,找第一个等于的,用第二个方法得出的结果判断。

  • 相关阅读:
    pyinstaller相关用法
    yield 与 yield from
    async /await相关知识理解
    调试程序方法pdb
    任务22-4
    任务22-2
    跳台阶
    计算三维空间某点距离原点的欧式距离
    质数判断
    罗马数字转换
  • 原文地址:https://www.cnblogs.com/shanyr/p/5956872.html
Copyright © 2011-2022 走看看