#P4094. 最长递增子序列
题目内容
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组 [0,3,1,6,2,2,7] 的子序列。
输入描述
一个整数数组 nums
输出描述
最长严格递增子序列的长度
样例1
输入
10 9 2 5 3 7 101 18
输出
4
说明
最长递增子序列是 [2,3,7,101],因此长度为 4。
样例2
输入
0 1 0 3 2 3
输出
4
样例3
输入
7 7 7 7 7 7 7
输出
1
提示:
\(1 <= nums.length <= 2500\)
\(-10^4 <= nums[i] <= 10^4\)
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
int n=0;
const int maxn=1e5+100;
int a[maxn];
int x;
int s[maxn];
int ans=0;
int main(){
while(cin>>x){
a[++n]=x;
}
for(int i=1;i<=n;i++){
if(!ans||a[i]>s[ans-1]){
s[ans++]=a[i];
}else{
int p=lower_bound(s,s+ans,a[i])-s;
s[p]=a[i];
}
}
cout<<ans<<endl;
}
手写二分
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
int n=0;
const int maxn=1e5+100;
int a[maxn];
int x;
int s[maxn];
int ans=0;
int lower(int x){
int l=0,r=ans-1,ans=-1;
while(r>=l){
int mid=(l+r)/2;
if(s[mid]>=x){
r=mid-1;
ans=mid;
}else{
l=mid+1;
}
}
return ans;
}
int main(){
while(cin>>x){
a[++n]=x;
}
for(int i=1;i<=n;i++){
if(!ans||a[i]>s[ans-1]){
s[ans++]=a[i];
}else{
int p=lower(a[i]);
if(p!=-1)
s[p]=a[i];
}
}
cout<<ans<<endl;
}