新的角度看二分

  • 二分就是将数组分为两段
  • 因此,问题的最终目标是找出蓝红边界

朴素算法

  • 红色指针一开始指向最右超出范围处,随后不断向左移动,直到找到蓝红边界;或者蓝色指针…
  • 时间复杂度O(n)O(n)O(n)

二分查找


  • 红蓝指针的移动其实代表着红蓝区域的拓展。那么,有什么更快拓展的方式呢?由于数组本身有序…便可以快速拓展红色 或 蓝色区域
  • 数组下标有效范围[0,n−1][0,n - 1][0,n−1],因此,初始时l = -1, r = n;
  • 循环的结束条件是l + 1 != r,因为l指向蓝色边界最右边,r指向红色边界最左边,当l + 1 == r时整个数组已经由灰色未知被划分完毕
  • 如果m是红色区域,直接r = m;同理…
  • 最后结果返回l还是r要看情况

细节1.为什么l的初始值为-1,r的初始值为n

  • 假如最终整个数组都该是红色区域,如果l初始化为0,l一开始就处在红色区域内,这会造成错误;同理…

细节2.m是否始终处于[0,n)以内

  • 只有处在这个区间以内,m才是有意义的
  • 先看m的下界,由于m = (l + r) / 2(向下),因此如果我们想让m尽可能小,就要l和r尽可能小,l的最小值是初始值-1,r如果能进入循环体,最小值是1(不是0),因此m最小值为0
  • 再看m上界,同理,r的最大值为n,l如果要进入循环体,最大值为n - 2,因此m最大值为n - 1

细节3.更新指针时,能不能写成l = m + 1或者r = m - 1


  • 如果刚好m指向蓝色区域的最后一个位置,l如果变为m + 1,就错了;同理…

细节4.会不会陷入死循环

  • 分别考虑l + 1 == r l + 2 == r l + 3 == r的情况
  • l + 1 == r,退出循环
  • l + 2 == r,也就是它们之间隔一个元素,当进入循环体时,m就是它们之间隔着的那个元素,接下来,要么将l设置成m,要么将r设置成m,也就是说,在循环体结束时,l的下一个元素一定是r,会回归到第一种情况并退出循环体
  • l + 3 == r,会回归到第二种情况或者回归到第一种情况

例子 与 c++库函数

  • lower_bound对应大于等于
  • upper_bound对应大于

一般流程

  • 后处理指的是 例如 只有蓝色区域/红色区域的返回值处理问题(需要特判)等

如果没有蓝色区域或者红色区域

  • 那么l或者r会不在有效范围内
  • 最后结果特判,l的初始值为-1,r的初始值为n

浮点数的二分

  • 题目 :通过二分查找的方式计算2\sqrt{2}2​,要求误差小于10−610^{-6}10−6
  • 退出循环的条件为r - l <= 1e-8
  • 要求误差小于10−610^{-6}10−6,相当于 结果保留6位小数;这样,循环退出的条件是10−810^{-8}10−8,而输出则是六位小数
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{double l = -10000, r = 10000;while (r - l > 1e-8){double mid = (l + r) / 2;if (mid * mid >= 2) r = mid;else l = mid;}
//    printf("%.6lf\n", l);cout << fixed << setprecision(6) << l << endl;return 0;
}

90%的程序员都写错的算法-二分查找万能模版相关推荐

  1. 毕业之后,这些年薪 50w+ 的 90 后程序员都经历了什么?纯水贴

    毕业之后,这些年薪 50w+ 的 90 后程序员都经历了什么? 即使是处于薪资链顶端的程序员,年薪(不含期权.股票等)超过 50 万,对他们而言也并不是一件容易事.就招聘平台 100offer 而言, ...

  2. 技术与市场脱钩?90%的程序员都错了!

    面对日新月异的技术潮流,怎样才能避免沦为与市场脱钩.甚至被无情清退的大龄码农?很多程序员都走了弯路! 安于现状,对于学习新技术这件事有些抵触: 一再拖延,身边的同事新框架玩的飞起,自己却懒于行动: 盲 ...

  3. 技术不够硬?90%的程序员都错了!

    面对日新月异的技术潮流,怎样才能避免沦为与市场脱钩.甚至被无情清退的大龄码农?很多程序员都走了弯路! 安于现状,对于学习新技术这件事有些抵触: 一再拖延,身边的同事新框架玩的飞起,自己却懒于行动: 盲 ...

  4. 年薪50万+的90后程序员都经历了什么?

    [文章来源微信公众号:每天学编程] 薪资是检验一家公司对你认可的标准,能达到年薪 50 万+,一定程度上说明了公司对你创造的价值的认可. 即使是处于薪资链顶端的程序员,年薪(不含期权.股票等)超过 5 ...

  5. 100%的程序员都想挑战的算法趣题!| 码书

    计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...

  6. 我敢打赌,这是98%的程序员都想挑战的算法趣题!

    计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...

  7. 100% 的程序员都想挑战的算法趣题!

    作者 | 图小敏 计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,&quo ...

  8. 90%的程序员都答不完的趣味题,答完领“神兵”!

    你是程序员?或者说你有朋友是程序员?快来看看我精心准备的几道送命题,测测你的级别在哪个阶段.哈哈哈哈! 玩法: 本次总共分三个模式,简单.一般和困难模式,每个模式只有3-4个小题,逐个回答,每个模式打 ...

  9. 为什么优秀的程序员都写博客?谈谈我都是如何写作的

    我的文章上热榜啦 首先在写之前给大家分享个歌单1 ,歌单二,分享歌单呢,主要是我在哔哩哔哩剪辑视频加的,我写东西不会去听音乐的,因为觉得那样,不利于 我的思维扩展. 进入正题 写博客呢首先要知道它具有 ...

最新文章

  1. xgboost源码 要看的
  2. svn更改用户名方法:
  3. ML之DTRFRExtraTRGBR:基于四种算法(DT、RFR、ExtraTR、GBR)对Boston(波士顿房价)数据集(506,13+1)进行价格回归预测并对比各自性能
  4. C++ Primer 5th笔记(chap 16 模板和泛型编程)定义
  5. java对象在内存中的布局
  6. Oracle Recyclebin
  7. 2018.9.19.Matlab实验四:Matlab程序设计
  8. RTT的线程同步篇——总结
  9. NumPy Cookbook 带注释源码 十、Scikit 中的乐趣
  10. [转载] Python字典及基本操作(超级详细)
  11. UE4之批量删除actor
  12. 取得系统当前日期和时间
  13. 不确定性,进化与经济理论
  14. 从小白到大咖——十分钟学会JavaScript操作浏览器内置对象
  15. pytoch 安装为Gpu版本
  16. 『开发技巧』全网最详尽手把手教你在Ubuntu安装搜狗输入法
  17. 计算机控制实验PID数字控制器设计,实验二数字PID控制器的设计
  18. 浅谈javascript注入攻击
  19. U盘无法格式化怎么办?!
  20. OpenCV 调用网络摄像头

热门文章

  1. 日常工作部门及体系相关单词
  2. SAP MM模块相关透明表收集
  3. 递归方法计划销售订单的计划物料成本
  4. redis的hGetAll函数的性能问题
  5. Windows基础题目
  6. ABAP TBL隐藏列
  7. Excel更正错误#NAME?
  8. SD从零开始15 税(Taxes)
  9. 位居行业第一,智能投影品牌坚果迎来3C数码零售行业的“扬眉曲线”?
  10. c语言程序可以单独编译,c语言中的函数可不可以单独进行编译?_后端开发