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;
    }
    

    查看更多

  • 相关阅读:
    转一篇:arp欺骗的原理和防御
    CF1209A Paint the Numbers
    字符串专题之KMP算法
    CF1209B Koala and Lights
    CF1217A Creating a Character
    CF1217B Zmei Gorynich
    各种模板
    开通博客园拉..
    汇编语言程序设计学习笔记(第一遍学习)第4节:汇编就像HTML一样简单
    我也要学C语言第二十章:结构体类型变量,结构体数组
  • 原文地址:https://www.cnblogs.com/lastk/p/12300543.html
Copyright © 2011-2022 走看看