算法专题(一)  二分法

考虑一个问题:
从1~100内选一个数,然后让别人去猜,你只会告诉他他才的数字大了或者小了,怎么去快速猜到你选的数呢?
解决上面的问题就会用到二分法:
一直去猜中间的数,如果大了,就抛弃中间的数和右边的所有数字;如果小了,就抛弃中间的数和左边的所有数字。如此重复下去,直到猜中数字。

来看看代码吧:

查找数列里第一个大于等于val的值,返回下标 先判断中间的数,如果小于我们要找的key,那么就把左边的数列,包括中间的都抛弃掉first=middle+1,否则就保留中间的数,抛弃掉右边的数列。

int my_lower_bound(int *arr, int size,int key){
int left=0,right=size;
int mid;
while(left<right){
mid=(left+right)>>1;
if(arr[mid]<key)
      left=mid+1;
else
      right=mid;
}
return left;
}

查找数列里第一个大于val的值,返回下标 可以看到,这个和lower_bound相比较而言只是改变了if else的顺序。先上代码,看了你就会知道。

int my_upper_bound(int *arr, int size,int key){
int left=0,right=size;
int mid;
while(left<right){
mid=(left+right)>>1;
if(arr[mid]>key)
      right=mid;
else
      left=mid+1;
}
return left;
}

可以看到:
1.如果查找第一个大于等于val的值,会抛弃掉所有小于val的值。
2.如果查找第一个大于val的值,会抛弃掉所有小于等于val的值。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找。本文...
    北方蜘蛛阅读 2,946评论 1 4
  • 本文的整理基于:http://blog.csdn.net/qq_23217629/article/details/...
    阿阿阿阿毛阅读 1,633评论 0 3
  • 【1】7,9,-1,5,( ) A、4;B、2;C、-1;D、-3 分析:选D,7+9=16;9+(-1)=8;(...
    Alex_bingo阅读 19,262评论 1 19
  • 今天完颜古方限量版水分子奢华修复套盒今日起开始预订,全国限量5000套,售价仅为298元。 功效:补水,美白,祛斑...
    涵_00a7阅读 368评论 0 0
  • 很想找一个未曾一起出行过的小伙伴,然后选一个都曾去过的城市,我想一定会有不少的惊喜吧…… 吴哥之行让各种突如其来的...
    蛋白艾力克阅读 315评论 0 0