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
  • 相关阅读:
    1093 Count PAT's(25 分)
    1089 Insert or Merge(25 分)
    1088 Rational Arithmetic(20 分)
    1081 Rational Sum(20 分)
    1069 The Black Hole of Numbers(20 分)
    1059 Prime Factors(25 分)
    1050 String Subtraction (20)
    根据生日计算员工年龄
    动态获取当前日期和时间
    对计数结果进行4舍5入
  • 原文地址:https://www.cnblogs.com/qwertiLH/p/7856400.html
Copyright © 2011-2022 走看看