[模板]二分答案

使用场景

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

什么是二分答案

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

求最小值

//求最小值
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时,则说明已经查询到符合的最小值。

求最大值

//求最大值
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,就会无限循环。

check函数构思

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

posted @   方而静  阅读(205)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示