(挑战程序设计P66)
lower_bound这个STL函数,从已安排好的序列a中利用二分搜索找出指向满足ai >= k的ai的最小指针。类似的函数还有upper_bound,这一函数求出的是指向满足ai > k的ai的最小指针。
如下图所示:
用这两个函数可以很快的求出长度为n的有序数组a中k的个数:
num = upper_bound(a, a+n, k) - lower_bound(a, a+h, k);
在求最长上升子序列问题中,用lower_bound会使代码更高效:
int dp[N];
void solve()
{
fill(dp, dp+n, INF);
for(int i = 0; i < n; i++)
*lower_bound(dp, dp+n, a[i]) = a[i];//在dp中找到大于等于a[i]的最小指针,也就是找到第一个a[i]
printf("%d\n", lower_bound(dp, dp+n, INF) - dp);//找到第一个INF的指针,减去头地址就是上升序列的长度
}
本文介绍了如何使用STL函数lower_bound和upper_bound来高效地解决编程问题,包括快速查找有序数组中特定元素的数量及求解最长上升子序列等。通过具体的代码示例展示了这些函数的应用。
392

被折叠的 条评论
为什么被折叠?



