zoukankan      html  css  js  c++  java
  • [模板]二分答案

    1.使用场景

    二分答案一般使用在求解符合条件的最小值或者最大值上面,当我们遇到这两个问题的时候,一般都可以使用二分答案来解决问题。

    2.什么是二分答案

    二分答案就是通过对所有可能的答案区间进行折半查找,不断缩减范围,最终确定答案的方法。

    3.求最小值

    //求最小值
    int binary (int left, int right) {
        int mid;
        while(left < right) {
            mid = (right + left) / 2;
            if (check(mid)) right = mid;
            else left = mid + 1;
        }
        return left;
    }
    

    我们可以知道,要求最小值,那么所满足条件的值赋值给右边界,不满足的值加一赋值给左边界,当left == right或者left > right时,则说明已经查询到符合的最小值。

    4.求最大值

    //求最大值
    int binary (int left, int right) {
        int mid;
        while(left < right) {
            mid = (right + left + 1) / 2;
            if (check(mid)) left = mid;
            else right = mid - 1;
        }
        return left;
    }
    

    同样,要求最大值,那么就需要舍弃符合条件的较小的值,即将左边界赋值符合条件的点,右边界赋值不符合条件的值减一。不断查询下去,则最后剩下符合条件最大值。其中mid = (right + left + 1) / 2是为了防止无限循环,因为当left = right + 1时刚好符合条件,left = (right + left) / 2,就会无限循环。

    5. check函数构思

    我们既然选择了使用二分法来求解,那么我们在check的时候,应该是在我们已知答案的情况下去确认答案,即不是从一般思考方向设想,而是验证。check函数往往是基于假定知道答案,来验证是否正确。

  • 相关阅读:
    云计算分布式大数据神器Spark实战高手之旅
    Spring IOC及AOP学习总结
    Win7下不能查看xp系统共享的文件,解决方法
    c#怎样获取excel单元格的RGB颜色
    MySQL 全角转换为半角
    【剑指offer】旋转数组的最小值
    POJ 2524 :Ubiquitous Religions
    GitLal+sourceTree版本号管理
    ASP.NET MVC 过滤器(五)
    Java设计模式之观察者模式
  • 原文地址:https://www.cnblogs.com/szdytom/p/binary_search.html
Copyright © 2011-2022 走看看