给定一个无序整数序列,怎样求其最长递增子序列?
#include <deque>
#include <cassert>
void MaxIncreaseQueue(const std::deque<int> & source,std::deque<int> & result)
{
typedef std::deque<int> IntArray;
//怎样从source中得到最长递增子序列放到result中?
}
经过分析我们发现,首先,我们要得到这个序列的最小值,所以我们建立了我们的第一个类GetMinValue:
class GetMinValue
{
int minvalue_;
public:
explicit GetMinValue(const IntArray & in){
assert(in.size() != 0);
IntArray::const_iterator i = in.begin();
for(minvalue_ = *i,++i;i != in.end();++i){
if(minvalue_ > *i)
minvalue_ = *i;
}
}
~GetMinValue(){}
operator int() const{
return minvalue_;
}
};
可以看到,GetMinValue以一个IntArray 为参数构造,并由operator int() const来返回其最小值。这样,我们可以这样来得到source的最小值:
int min = GetMinValue(source);
然后我们开始考虑算法的问题。我想很多人都知道计算机里的堆的概念,一个堆就是一个类似于树的结构,只是它的节点满足一定的排列规则,于是比一般的树更有规律,也更复
杂。我们这里构造这样一个堆(同时也是一棵树,所以我用了Tree这个名字),其父节点的值总比子节点小(或相等),其右节点的值总比左节点小,如图:
2 ——父节点值比子节点小
/ /