#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;
	
}
posted @ 2025-08-05 10:13  lipu123  阅读(7)  评论(0)    收藏  举报