zoukankan      html  css  js  c++  java
  • 整数二分算法

    一、整数二分算法

    1.1 编写整数二分,记住下面的内容,代码也就游刃有余了!

    (1) 首先找到数组的中间值,mid=(left+right)>>1,区间[left, right]被划分成[left, mid]和[mid + 1, right];如果是mid = l + r + 1 >> 1,区间[left, right]被划分成[left, mid - 1]和[mid, right]。

    (2) 然后通过check(mid)判断中间值是不是满足这个性质,check是根据不同的题型编写的。

    (3) 最后就能使用折半,缩小区间了,如果区间缩到了1,那么那个也就是答案。

    二、整数二分算法的核心

    2.1 二分的本质不是单调性

    (1) 如果有单调性,一定可以二分,但是可以二分的题目,不一定有单调性。

    (2) 二分的本质,问题一半满足,一半不满足,可以寻找到边界,这个边界可以将数组分为两个部分。因为整数边界必须做出选择,代码将有两个模板。而浮点数不是。

    2.2 二分的主要思想是折半

    二分一定是有解的,那个边界可以二分出来,但题目可能是无解的。

    三、整数二分算法的代码模板

    bool check(int x) {/* ... */} //检查x是否满足某种性质
    
    // 区间[left, right]被划分成[left, mid]和[mid + 1, right]时使用:
    int bsearch_1(int l, int r)
    {
        while (l < r)
        {
            int mid = l + r >> 1;
            if (check(mid)) r = mid;//左边,check()判断mid是否满足性质
            else l = mid + 1;//右边
        }
        return l;
    }
    // 区间[left, right]被划分成[left, mid - 1]和[mid, right]时使用:
    int bsearch_2(int l, int r)
    {
        while (l < r)
        {
            int mid = l + r + 1 >> 1;
            if (check(mid)) r = mid-1;//左边
            else l = mid;//右边
        }
        return l;
    }
    

    查看更多

  • 相关阅读:
    网络字节序与主机字节序
    Maven2插件开发详解
    NetBeans 时事通讯(刊号 # 30 Oct 15, 2008)
    NetBeans 时事通讯(刊号 # 30 Oct 15, 2008)
    Grsync:rsync 的图形化界面
    Windows Socket网络编程学习笔记一
    如何调试MFC中的内存泄漏
    内存池(MemPool)技术详解
    These codes are How to use Lucence.net
    VC控制台程序的文字颜色
  • 原文地址:https://www.cnblogs.com/lastk/p/12300543.html
Copyright © 2011-2022 走看看