zoukankan      html  css  js  c++  java
  • 浅谈二分的细节问题

    最大值最小

    给定一个不降的序列 (a),求其中大于等于 (x) 的第一个数。

    其实就是查找第一个合法的点。

    while(l<r)
    {
          mid=(l+r)>>1;
          if(a[mid]<x)l=mid+1;
          else r=mid;
    }
    

    如果当前 (mid) 小了,就向右寻找,当前 (mid) 不可能是答案,可以直接忽略 (mid),以 (mid+1) 为左端点。

    如果当前 (mid) 大了或等于了,就向左寻找,当前 (mid) 可能是答案,不可以直接忽略 (mid),应该以 (mid) 为右端点。

    初始条件默认 (lleq r)。因为是整除 (oldsymbol 2),所以在循环中 (midin[l,r),mid+1in(l,r]),不会死循环也不会跳出 (l,r)

    所以最后 (l=r)

    最小值最大

    给定一个不升的序列 (a),求其中小于等于 (x) 的第一个数。

    其实就是查找最后一个合法的点。

    while(l<r)
    {
          mid=(l+r+1)>>1;
          if(a[mid]>x)r=mid-1;
          else l=mid;
    }
    

    如果当前 (mid) 大了,就向左寻找,当前 (mid) 不可能是答案,可以直接忽略 (mid),以 (mid-1) 为右端点。

    如果当前 (mid) 小了或等于了,就向右寻找,当前 (mid) 可能是答案,不可以直接忽略 (mid),应该以 (mid) 为左端点。

    初始条件默认 (lleq r)。因为是(oldsymbol 1) 后整除 (oldsymbol 2),所以在循环中 (midin(l,r],mid-1in[l,r)),不会死循环也不会跳出 (l,r)

    所以最后 (l=r)

    一些拓展

    如果我们需要在一个不降的序列中找等于 (x) 的最后一个元素或在一个不升的序列中找等于 (x) 的最后一个元素,那么可以将 (x)(1) 或加 (1) 后转化为上面讲的两个形式。

  • 相关阅读:
    oracle数据库物理结构逻辑结构内存区块进程管理
    系统的数据库设计
    大数据和高并发的解决方案总结
    Asp.net+WebSocket+Emgucv实时人脸识别
    初识Docker
    变位词程序的实现
    分布式系统常见问题#转载
    六类排序算法的C#实现
    Asp.net MVC 中Controller返回值类型ActionResult
    将应用程序中的一些参数写到xml配置文件中
  • 原文地址:https://www.cnblogs.com/May-2nd/p/13886594.html
Copyright © 2011-2022 走看看