最近一直在学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 }