无敌二分模板

技术 · 04-02 · 211 人浏览
  • 先放模版
int L=-1,R=n;
while(L+1!=R)
{
    int mid=L+R>>1;
    if(check()) L=mid;
    else R=mid;
    //最后根据你所分左右两边区间的结果
    //选取L或者R作为结果
}
  • 模板解释
  1. 二分的左右边界是L和R,初始时L=-1,R=n
  2. 二分的终止条件是L+1==R,即L和R相邻
  3. 二分的中点是mid=L+R>>1
  4. 二分的判断条件是check(),如果check()为真,说明mid是一个可行解,所以L=mid,否则R=mid
  5. 二分的最后结果是L或者R,根据你所分左右两边区间的结果选取L或者R作为结果
  • 该模版的特点
  1. 该模版不需要考虑mid+1和mid-1,因为mid+1和mid-1的情况在check()中已经考虑了
  2. 该模版的二分区间是[L,R),即左闭右开区间,所以最后的结果是L或者R,根据你所分左右两边区间的结果选取L或者R作为结果
可以参考这个网站进行练习

参考: 不需要考虑mid+1、mid-1的二分查找模板,希望大家都能学会

算法
Theme Jasmine by Kent Liao