lower_bound和upper_bound

本文深入讲解了二分查找算法中的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);

}

 

 

转载于:https://www.cnblogs.com/unknownname/p/8823260.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值