Longest Ordered Subsequence(最长递增子序列)
这个题目的数据量不大,O(n2)也过得了,但今天主要讲时间复杂度为O(nlogn)的代码。
首先我们要设置一个vector<int> L{先赋字符串的第一个值}
L[i]: 长度为i+1的LIS的最小结尾
在循环n-1次,每次判断,a比目前所有LIS结尾都大,直接附上去
否则就把下一个比他大的值,换成它的值,这样保证是递增的
看完了逻辑,再让我们看一下代码:
结合代码在来理解一下
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false), cin.tie(0);
int N, a;
cin >> N >> a;
vector<int> L{a}; // L[i]: 长度为i+1的LIS的最小结尾
for (int i = 1; i < N; i++) {
cin >> a;
if (a > L.back()) // a比目前所有LIS结尾都大,直接附上去
L.push_back(a);
else // 1 3 4 8 9 + 7, 7替换8
*lower_bound(begin(L), end(L), a) = a;
}
cout << L.size() << "\n"; // LIS长度
return 0;
}