zoukankan      html  css  js  c++  java
  • 不同情况下的二分搜索模板

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~
    http://www.cnblogs.com/chenxiwenruo/p/8538760.html
    特别不喜欢那些随便转载别人的原创文章又不给出链接的
    所以不准偷偷复制博主的博客噢~~

    二分搜索算是常见的搜索方式了,由于有时候经常会遇到返回值不同的情况出现,所以就把能想到的几个整理了下。

    1.如果存在,返回对应的索引(任意一个即可);如果不存在,返回-1

    /*
    a为已经排序好的数组,t为要查找的目标值,n为数组长度
    如果存在,返回任意一个索引即可
    如果不存在,返回-1
    */
    int binarySearch(int *a,int t,int n){
        int l=0,r=n-1;
        int mid;
        //注意这里是l<=r
        while(l<=r){
            mid=(l+r)>>1;
            if(a[mid]==t)
                return mid;
            if(t<a[mid])
                r=mid-1;
            else
                l=mid+1;
        }
        return -1;
    }
    View Code

    2.如果存在多个目标值t,返回最小的索引;如果不存在,返回-1

    /*
    a为已经排序好的数组,t为要查找的目标值,n为数组长度
    如果存在多个目标值t,返回最小的索引
    如果不存在,返回-1
    */
    int binarySearchMinIdx(int *a,int t,int n){
        int l=0,r=n-1;
        int mid;
        while(l<r){
            mid=(l+r)>>1;
            printf("%d %d %d
    ",l,r,mid);
            //注意,由于是返回索引值最小的,所以这里r=mid,而不是mid-1,因为mid也有可能是最终的结果。
            if(t<=a[mid])
                r=mid;
            else
                l=mid+1;
        }
        //while条件结束时,l==r,因此判断a[l]是否=t即可
        if(a[l]==t)
            return l;
        else
            return -1;
    }
    View Code

     反之,也有返回最大的索引。拿做数学题经常用的话语来讲,同理即可,就是任性。

    3.返回 值<=t的索引,若不存在,返回0(也可以自己改为-1,加个条件而已)

    注意,第3个和第4个,是在a[1~n]中搜索,而不是在a[0~n-1]中搜索。

    可以自己尝试去写在[0~n-1]中搜索的情况,其实差不多的,只不过最后返回的时候要多几个判断条件

    /*
    在数组a[1~n]中搜索t
    若t在,则返回t的索引
    若t不在a中,则返回的是比t小的索引
    如果没有比t小的,则返回0
    */
    int binarySearchSmallOrSmaller(int *a,int t,int n){
        int l=0,r=n+1;
        int mid;
        //注意这里为啥是l<r-1,因为下面l=mid,r=mid,所以当最后若对于l=r-1,t>=a[l],就会陷入死循环
        while(l<r-1){
            mid=(l+r)>>1;
            if(a[mid]<=t)
                l=mid;
            else
                r=mid;
        }
        return l;
    }
    View Code

    4.返回 值>=t的索引,若不存在,返回n+1(也可以自己改为-1,加个条件判断一下即可)

    /*
    在数组a[1~n]中搜索t
    若t在,则返回t的索引
    若t不在a中,则返回的是比t大的索引
    如果没有比t大的,则返回n+1
    */
    int binarySearchLargeOrLarger(int *a,int t,int n){
        int l=0,r=n+1;
        int mid;
        while(l<r-1){
            mid=(l+r)>>1;
            if(a[mid]>=t)
                r=mid;
            else
                l=mid;
        }
        return r;
    }
    View Code
  • 相关阅读:
    学Java需要了解的linux系统和unix系统
    51Nod 1649: 齐头并进(最短路)
    51Nod 1694: 两条路径(图论)
    The Preliminary Contest for ICPC Asia Shanghai 2019
    牛客练习赛52 A:数数(快速幂)
    The Preliminary Contest for ICPC Asia Shenyang 2019
    The 2019 Asia Nanchang First Round Online Programming Contest
    2019 年百度之星·程序设计大赛
    2019中国大学生程序设计竞赛(CCPC)
    2019 年百度之星·程序设计大赛
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/8538760.html
Copyright © 2011-2022 走看看