• lower_bound和upper_bound算法实现


      lower_bound算法要求在已经按照非递减顺序排序的数组中找到第一个大于等于给定值key的那个数,其基本实现原理是二分查找,如下所示:

    int lower_bound(vector<int> arr, int key) {
        int half;
        int len = arr.size();
        int mid;
        int first = 0;
        while (len > 0) {
            half = len >> 1;
            mid = first + half;
            //in the right part
            if (arr[mid] < key) {
                first = mid + 1;
                //因为first=mid+1,所以这里的len需要在减去half的基础之上再减去1
                len = len - half - 1;
            } else {
                //in the left part
                len = half;
            }
        }
        return first;
    }

      upper_bound函数要求在按照非递减顺序排好序的数组中找到第一个大于给定值key的那个数,其基本实现原理是二分查找,具体实现如下所示:

    int upper_bound(vector<int> arr, int key) {
        int mid;
        int first = 0;
        int len = arr.size();
        int half;
        while (len > 0) {
            half = len >> 1;
            mid = half + first;
            if (arr[mid] > key) {//in the left part
                len = half;
            } else {//if arr[mid]<= key ,in the right part
                first = mid + 1;
                len = len - half - 1;
            }
        }
        return first;
    }

      上述两种实现参考了stl中的实现方式,返回满足条件的值在数组中的下标。如果找不到满足条件的值,将会返回数组的大小,就像迭代器中的end一样,对应有效下标的下一个值。

  • 相关阅读:
    01:求平均年龄
    09:与圆相关的计算
    08:温度表达转化
    07:计算多项式的值
    06:甲流疫情死亡率
    05:计算分数的浮点数值
    04:带余除法
    03:计算(a+b)/c的值
    02:计算(a+b)*c的值
    01:A+B问题
  • 原文地址:https://www.cnblogs.com/zhoudayang/p/5679066.html
Copyright © 2020-2023  润新知