zoukankan      html  css  js  c++  java
  • lower_bound和upper_bound的实现和基本用法

      最近一直在学dp,但是感觉进度明显慢了很多,希望自己可以加一把劲,不要总是拖延了...

      在LIS的优化中我遇到了二分查找的问题,之前也知道lower_bound和upper_bound两个函数,但是没有做一个具体的总结,在下面我会总结这两个函数的用法,也会给出这两个函数的实现代码,代码是参考c ++ Reference 里面的...

    lower_bound:

      这个函数的头文件为#include <algorithm>,函数的返回值为一个指向单调序列[first, last) 中第一个不小于val的元素的地址,如果不存在满足条件的

    元素则返回NULL。你可以用该函数得到的指针的值减去数组开头元素的地址得到他在单调序列中的位置。

      下面解释一下该函数的几个参数:lower_bound(first, last, val);

      表示在有序序列[first, lase) 的所有值中,第一个不小于val的元素的地址。

      下面给出我自己对于lower_bound优化后实现的代码:有错误还请多多指出...

      该代码并没有返回指针,而是直接返回了下标......

    1 int lower_bound(vector<int> &a, int val) {
    2     int first = 0, last = a.size() - 1, mid;
    3     while(first <= last) {
    4         mid = last - (last - first) / 2;
    5         if(a[mid] >= val) last = mid - 1;
    6         else first = mid + 1;
    7     }
    8     return first;
    9 }

    upper_bound

      这个函数和上面的函数内容只有一点不同,他返回的是单调序列中第一个大于val的元素的地址,如果不存在满足条件的元素则返回NULL,下面再给出我自己写的版本......

    1 int upper_bound(vector<int> &a, int val) {
    2     int first = 0, last = a.size() - 1, mid;
    3     while(first <= last) {
    4         mid = last - (last - first) / 2;
    5         if(a[mid] <= val) first = mid + 1;
    6         else last = mid - 1;
    7     }
    8     return first;
    9 }
  • 相关阅读:
    实验二 顺序结构程序设计
    Cracking the Coding Interview(1)
    zigzag数组,螺旋数组
    程序员面试宝典之输入两个字符串,比如abdbcc和abc,输出第二个字符串在第一个字符串中的连接次序,即输出125,126,145,146
    static成员函数、成员变量
    快捷键
    多态的总结
    单实例设计模式及C++实现
    快速排序代码
    对象初始化
  • 原文地址:https://www.cnblogs.com/bianjunting/p/10581368.html
Copyright © 2011-2022 走看看