Longest Increasing Subsequence
给定一个数组,找出longest increasing subsequence的长度
这个solution用dynamic programming(DP)方法。
首先,使用vector<int> res来记录当前longest increasing subsequence.
然后遍历nums, 如果res中没有比当前元素n大的元素,就说明n可以作为subsequence新的最后一个元素,以此来增加subsequence的长度。如果res中有比n大的元素,说明n并不能用来增加subsequence的长度,但是不能就这样丢弃n,因为n及n后面的一些元素很有可能替代现在res中的一些元素构成更长的subsequence,所以我们做一个不影响最后长度且能更新元素的方法:用n来替换res中第一个比n大的元素。
最后返回res.size()
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
vector<int> res;
for (auto n: nums) {
auto it = lower_bound(res.begin(), res.end(), n);
if (it == res.end()) res.push_back(n);
else *it = n;
}
return res.size();
}
};