最长上升子序列 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

posted @ 2022-07-12 22:42  qbning  阅读(34)  评论(0)    收藏  举报
描述