问题:
求一个序列的最长递增子序列,这样的子序列是允许中间越过一些字符的。
例如:4 2 3 1 5 的最长递增子序列为 2 3 5,长度为 3 。
腾讯一面,安奇信笔试
DP => record[i]:递增长度为 i 的子序列的最小结尾值。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 实现求序列中最长子序列长度
* @param N int整型 元素个数
* @param sequence int整型vector 给定序列
* @return int整型
*/
// 用一个数组记录当前递增序列长度(索引)的最小值
int LSubSequence(int N, vector<int>& sequence) {
// write code here
if (N==0) return 0;
vector<int> record={0,sequence[0]};
int ilen=1;
for(int i=1;i<N;++i){
if(sequence[i]>record[ilen]){ // 继续升序
record.push_back(sequence[i]);
ilen++;
}else{
for(int j=ilen;j>0;--j){ // 这里可优化:二分查找(函数)
if(sequence[i] < record[j] && sequence[i]>record[j-1]){
record[j]=sequence[i];
}
}
}
}
return ilen;
}
};
其实还可以继续优化:else 后的这个for循环可以用二分查找