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
  • 相关阅读:
    Centos下安装Redis
    BZOJ 4870 [Shoi2017]组合数问题 ——动态规划 矩阵乘法
    BZOJ 4868 [Shoi2017]期末考试 ——三分 枚举
    BZOJ 4584 [Apio2016]赛艇 ——动态规划
    BZOJ 2806 [Ctsc2012]Cheat ——后缀自动机 单调队列优化DP
    BZOJ 2330 [SCOI2011]糖果 ——差分约束系统 SPFA
    Topcoder SRMCards ——贪心
    CTSC 1999 家园 【网络流24题】星际转移
    BZOJ 3489 A simple rmq problem ——KD-Tree
    BZOJ 2733 [HNOI2012]永无乡 ——线段树 并查集
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/8538760.html
Copyright © 2011-2022 走看看