二分查找!!再学不会就是瓜皮

首先想清楚!!二分查找分为四种(数组中包含重复元素)分别为

YES_LEFT   ----> 能找到且返回最左边的数的位置
YES_RIGHT ----> 能找到且返回最右边的数的位置
NO_LEFT     ----> 不能找到且返回左边与其接近的数的位置
NO_RIGHT  ----> 不能找到且返回右边与其接近的数的位置

例如下列数组:

2 3 4 4 4 6 6 6 6 7

YES_LEFT(4) -> 2 
YES_RIGHT(4) -> 4 
NO_LEFT(6) -> 4 
NO_RIGHT(6) -> 9

对于YES_LEFT或者NO_RIGHT

int bSearch(int begin, int end, int e)  
{  
    int mid;
    int  left = begin;
    int  right = end;  

    while(left <= right)  
    {   
        mid = (left + right) >> 1;  
        if(num[mid] >= e){
            right = mid - 1;  
        }else {
            left = mid + 1;
        }  
    }  
    return left;  
}  

对于YES_RIGHT或者NO_LEFT

 int bSearch(int begin, int end, int e)  
    {  
        int mid;
        int  left = begin;
        int  right = end;  

        while(left <= right)  
        {   
            mid = (left + right) >> 1;  
            if(num[mid] > e){
                right = mid - 1;  
            }else {
                left = mid + 1;
            }  
        }  
        return right;  
}  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,768评论 0 33
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,759评论 18 399
  • 最近在看数据结构,研究了一下常用的几种排序方法:1.冒泡排序,2.选择排序,3.插入排序,4.希尔排序,5.快速排...
    wo883721阅读 1,505评论 0 4
  • 1 前言 二分查找本身是个简单的算法,但是正是因为其简单,更容易写错。甚至于在二分查找算法刚出现的时候,也是存在b...
    __七把刀__阅读 1,408评论 0 1
  • 为避免出现紧张,脱离自己的掌控,一般的情形都是通过训练解决。 埋头苦干并不会获得一切。 为什么现在没有很紧张呢?是...
    Helexy22阅读 277评论 0 0