二分查找 (最经典代码,及其边界条件的实践分析)


(注: 原创博客,转载请引用 http://www.cnblogs.com/wubdut/p/5578147.html)

代码举例: Array递增,找第一个不小于target的下标。

  int theIndex(vector<int> Array) {

    int lo = 0, hi = Array.size()-1;

    while (lo <= hi) {

      int mid = (lo+hi)/2;

      if (target > A[mid]) lo = mid+1; // (1)

      else hi = mid-1; // (2)

    }

    return lo; // (3)

  }

解析: 本段代码引自LeetCode。这是一段非递归的二分查找的代码,其核心代码只有4行, 看起来十分简单,又好理解,但要想在实践中灵活运用并不容易。问题当让出在边界条件,总结为两条:

    a. (1)和(2)哪个包含“=”;

    b. 返回lo还是hi。

问题a: 只有通过边界检测来完成,将mid-1,mid,mid+1,target设相同值x,结合实际条件判断等号位置;

问题b: so easy 啦!!!等号不是谁的,就返回谁。以后妈妈再也不用担心我死记硬背二分了(^_^)

优质内容筛选与推荐>>
1、vue项目中主要文件的加载顺序(index.html、main.js、App.vue)
2、游戏中反向运动学(ik)的研究与简介
3、UIWebView上实现离线缓存
4、记录:查看Active Directory里的用户的属性
5、Lucene.Net 入门---介绍篇


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号