zoukankan      html  css  js  c++  java
  • 各种类型的二分模板

    lower_bound()在first和last中的前闭后开区间进行,返回大于或等于val的第一个元素位置。

    如果所有元素都小于val,则返回last的位置

     

    1、查找最后一个小于或者等于key的下标,若不存在,则返回-1

    int BinSearch(int a[], int n, int key)
    {
        int m, l = 0, r = n - 1;//闭区间[0, n - 1]
        while (l <= r)
        {
            m = (l+r)/2;
            if (a[m] <= key) l = m + 1;
            else if(a[m] > key) r = m - 1;
        }
        if(l == 0) return -1;//not find
        return l-1;
    }
    View Code

    2、查找第一个大于或者等于key的下标,若不存在,则返回-1

    int BinSearch(int a[], int n, int key)
    {
        int m, l = 0, r = n - 1;//闭区间[0, n - 1]
        while (l <= r)
        {
            m = (l+r)/2;
            if (a[m] < key) l = m + 1;
            else if(a[m] >= key) r = m - 1;
        }
        if(r == n-1) return -1;//not find
        return r+1;
    }
    View Code

    3、查找第一个与key相等的下标,若不存在,则返回-1

    int BinSearch(int a[], int n, int key)
    {
        int m, l = 0, r = n - 1;//闭区间[0, n - 1]
        while (l < r)
        {
            m = l + ((r - l) >> 1);//向下取整
            if (a[m] < key) l = m + 1;
            else r = m;
        }
        if (a[r] == key) return r;
        return -1;
    }
    View Code

    4、查找最后一个与key相等的小标,若不存在,则返回-1

    int BinSearch(int a[], int n, int key)
    {
        int m, l = 0, r = n - 1;//闭区间[0, n - 1]
        while (l < r)
        {
            m = l + ((r + 1 - l) >> 1);//向上取整
            if (a[m] <= key) l = m;
            else r = m - 1;
        }
        if (a[l] == key) return l;
        return -1;
    }
    View Code

    5、查找第一个大于key的下标,若不存在,则返回-1 ==> 同upper_bound()

    int BinSearch(int a[], int n, int key)
    {
        int m, l = 0, r = n - 1;//闭区间[0, n - 1]
        while (l < r)
        {
            m = l + ((r - l) >> 1);//向下取整
            if (a[m] <= key) l = m + 1;
            else r = m;
        }
        if (a[r] > key) return r;
        return -1;
    }
    View Code

    6、查找最后一个小于key的下标,若不存在,则返回-1

    int BinSearch(int a[], int n, int key)
    {
        int m, l = 0, r = n - 1;//闭区间[0, n - 1]
        while (l < r)
        {
            m = l + ((r + 1 - l) >> 1);//向上取整
            if (a[m] < key) l = m;
            else r = m - 1;
        }
        if (a[l] < key) return l;
        return -1;
    }
    View Code
  • 相关阅读:
    C++ VC实现对话框窗口任意分割
    C++ 关于滚动条的滚动问题
    C++ 自定义控件的移植(将在其它程序中设计的自定义控件,移植到现在的系统中)
    C++ 动态创建按钮及 按钮的消息响应
    C++ Custom Control控件 向父窗体发送对应的消息
    C++ MFC 改变控件大小和位置
    C++ 使用VS2010创建MFC ActiveX工程项目
    VC++ 自定义控件的建立及使用方法
    C++ CTreeview的checkbox使用方法
    C++ vc中怎么使用SendMessage自定义消息函数
  • 原文地址:https://www.cnblogs.com/qwertiLH/p/7856400.html
Copyright © 2011-2022 走看看