给定一个长度为 N N N 的数列,求数值严格单调递增的子序列的长度最长是多少。
输入格式
第一行包含整数 N N N。
第二行包含 N N N 个整数,表示完整序列。
输出格式
输出一个整数,表示最大长度。
数据范围
1
≤
N
≤
100000
1 \le N \le 100000
1≤N≤100000,
−
1
0
9
≤
数列中的数
≤
1
0
9
\\-10^9 \le 数列中的数 \le 10^9
−109≤数列中的数≤109
输入样例:
7
3 1 2 1 8 5 6
输出样例:
4
方法
在一个空数组种,每次放入一个新的数字都想找到在这个数组中第一个小于数字的后一位放进去,
如果这个数组里面有原值我们就修改他,否则就往后添加一位。 如果我们放的是最后一位,那么长度+1。
注意
这个栈并不是记录最长子序列。
每次改变len的值才更新最长数组,因为这个是线性的。每次替换是为了方便len的变长。这里更推荐拿草稿纸去模拟一下情况。才能更好的了解一下这个代码
#include<iostream>
using namespace std;
const int N =100010;
int a[N];
int s[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
int len=0;
s[0]=-2e9;
for(int i=1;i<=n;i++)
{
int l=0,r=len;
while(l<r)
{
int mid=l+r+1>>1;
if(s[mid]<a[i])
l=mid;
else
r=mid-1;
}
s[l+1]=a[i];
if(l==len)len++;
}
cout<<len;
}