解题思路:开一个栈,每次取栈顶元素top和读到的元素temp做比较,
如果temp > top 则将temp入栈;如果temp < top则查找栈中的比temp大的第1个数,并用temp替换它。
最长序列长度即为栈的大小。
举例:原序列为1,5,8,3,6,7
栈为1,5,8,此时读到3,用3替换5,得到1,3,8; 再读6,用6替换8,得到1,3,6;再读7,得到最终栈为1,3,6,7。最长递增子序列为长度4。
具体代码如下:
class AscentSequence {
public:
int findLongest(vector<int> A, int n) {
if(n <= 1)
return n;
vector<int> vec;
for(int i = 0; i < n ; i++)
{
auto it = upper_bound(vec.begin(),vec.end(),A[i]); //返回第一个比A[i]大的元素的位置
if(it == vec.end())
vec.push_back(A[i]);
else
*it = A[i];
}
return vec.size();
}
};
如果temp > top 则将temp入栈;如果temp < top则查找栈中的比temp大的第1个数,并用temp替换它。
最长序列长度即为栈的大小。
举例:原序列为1,5,8,3,6,7
栈为1,5,8,此时读到3,用3替换5,得到1,3,8; 再读6,用6替换8,得到1,3,6;再读7,得到最终栈为1,3,6,7。最长递增子序列为长度4。
具体代码如下:
class AscentSequence {
public:
int findLongest(vector<int> A, int n) {
if(n <= 1)
return n;
vector<int> vec;
for(int i = 0; i < n ; i++)
{
auto it = upper_bound(vec.begin(),vec.end(),A[i]); //返回第一个比A[i]大的元素的位置
if(it == vec.end())
vec.push_back(A[i]);
else
*it = A[i];
}
return vec.size();
}
};