lower_bound和upper_bound

原创:https://www.cnblogs.com/unknownname/p/8823260.html

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\n",lower_bound(dp,dp+n,INF)-dp);

}

 

猜你喜欢

转载自blog.csdn.net/qq_40086556/article/details/80042225