最长上升子序列 II
今天有个导弹问题,看来就是两个最长上升子序列,然后求一下就行,但是数据范围10w,之前n方的过不了,这里有个nlogn的算法
最长上升子序列 II
给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。
输入格式
第一行包含整数 N。
第二行包含 N 个整数,表示完整序列。
输出格式
输出一个整数,表示最大长度。
数据范围
1≤N≤100000,
−109≤数列中的数≤109
输入样例:
7
3 1 2 1 8 5 6
输出样例:
4
acwing的算法里引入一个数组q[i]来存储最长上升子序列长度为i时的值(目前还有点迷糊是不是最大值)
然后二分查找,每次判断一个元素就找它之前能添加的最大的。他在视频里论证了q是单增的。
emm有点云里雾里,上代码
#include<iostream>//最长上升子序列
using namespace std;
int n;
int a[100001],q[100001];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int len=0;
q[0]=-2e9;
for(int i=1;i<=n;i++)
{
int l=0,r=len;
while(l<r)
{
int mid=r+l+1>>1;
if(q[mid]<a[i])l=mid;
else r=mid-1;
}
//此时二分查找到a[i]可以插入到的最大的小于a[i]的
len=max(len,r+1);
q[r+1]=a[i];
}
cout<<len;
return 0;
}
感觉这位大佬的比较透彻https://www.cnblogs.com/wxjor/p/5524447.html
作者:qbning
-------------------------------------------
个性签名:曾经的我们空有一颗望海的心,却从没为前往大海做过真正的努力
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

浙公网安备 33010602011771号