• lower_bound和upper_bound


    ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。

    ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回一个非递减序列[first, last)中第一个大于val的位置。

       lower_bound和upper_bound如下图所示:

    比如给一个数组

    a[0] = 1;a[1] = 2;a[2] = 3;a[3] = 5;a[4] = 7;

    lower_bound(a,a+5,6)表示从a开始五个位置,查找6,返回的是第一个>=6的数的迭代器指针

    即返回的是7的指针,减去a,就得到了a[4]对应的数组下标4

    upper_bound(a,a+5,5)表示第一个>5的数的指针,也是4

    查找的前提是容器要有序,如果找不到>=或>的,就会返回末尾位置

    用法:int low = (lower_bound(a,a+n,a[i]) - a)

    a:数组名

    (a,a+n):二分查找的范围

    a[i]:查找的值

    (lower_bound(a,a+n,a[i]) - a):-a取数组中的下标,即相对位置,返回类型为Int

    int up =  (upper_bound(a,a+n,a[i])-a)

    适用范围:

    1.查找有序序列中的某个元素的下标(lower_bound找不到返回数组末尾位置)

    2.查找某个有序序列中,重复元素的个数(up-low+1)

    3.最长上升子序列

    int dp[maxn];

    void solve()

    {

      fill(dp,dp+n,INF);

      for(int i = 0; i < n; i++)

      {

        *lower_bound(dp,dp+n,a[i]) = a[i];

      }

      printf("%d ",lower_bound(dp,dp+n,INF)-dp);

    }

  • 相关阅读:
    ORA01093: ALTER DATABASE CLOSE only permitted with no sessions connected DG开启MRP失败
    计算机专业自学路线
    asp.net(C#) 中文乱码
    k8s的搭建1.18(二)
    k8s的搭建1.15(一)
    loguru多进程切分日志异常分析
    Fresh ideas about new businesses
    Python进阶3.2再论静态方法和类方法
    Python进阶3.3多继承以及MRO顺序
    GO学习之介绍安装
  • 原文地址:https://www.cnblogs.com/unknownname/p/8823260.html
Copyright © 2020-2023  润新知