之前我们用过dp来求最长上升序列的长度,而对于此算法的复杂度为O(n^2),而我们可以用二分来进行进一步的优化,使用贪心策略,遍历每个数组的值,使用ans数组来存储当前的最长上升序列,并利用二分查找来寻找当前ans数组中第一个大于该数字的位置并进行替换,同时统计当前的下标和len之中的最大值,最后输出len长度即可
上代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 5050;
int a[N];
int ans[N];//用于存储答案
int main(void)
{
int n; cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
int len = 0;//记录当前最长上升序列的长度
for(int i = 1; i <= n; i++){
int cnt = lower_bound(ans + 1, ans + len + 1, a[i]) - ans;//返回第一个大于等于a[i]的下标
ans[cnt] = a[i];
len = max(cnt, len);//如果此时cnt大于len就直接更新len
}
cout << len << endl;
return 0;
}