前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >最长上升子序列

最长上升子序列

作者头像
宁在春
发布2022-10-31 14:19:00
4030
发布2022-10-31 14:19:00
举报
文章被收录于专栏:关于Java学习@宁在春

题目:给定一个无序的整数数组,找出其中最长上升子序列(L I S)的长度。

输入:[5,7,1,9,4,6,2,8,3]

输出:4

解释:最长上升子序列为[1,4,6,8]

递推式:

  • 由小推大(最优子结构)
  • 由过去推现在(无后效性)

代码:

代码语言:javascript
复制
#include<bits/stdc++.h>
using namespace std; 
int a[101]={5,7,1,9,4,6,2,8,3};
int f[101]={};
int n=9;
int ans=1;
int main(){
	for(int i=1;i<=n;i++) f[i]=1;

	for(int i=2;i<n;i++){
		for(int j=1;j<i;j++)
			if(a[i]>a[j])
				f[i]=max(f[j]+1,f[i]);
			ans=max(f[i],ans);
	}
	printf("%d",ans);
	return 0;	
}

这个代码的时间复杂度为 O(n 2)

最长上升子序列–二分查找

代码:

代码语言:javascript
复制
#include<bits/stdc++.h>
using namespace std; 
//int a[101]={1,2,5,9,4,6,7,1,7,2}; 1 2 5 9 4 6 7 1 7 2
								//  1 9 5 9 4 6 7 1 7 2
								//  3 9 9 9 9 9 9 9 7 8
								//  3 1 2 1 8 5 6
int a[101000];
int n;
int b[101000];
int len;
int find(int x){
	// 二分查找第一个大于等于x 的位置 
	int L=1,R=len,mid;
	while(L<R){
		mid=(L+R)/2;
		if(x>b[mid])L=mid+1;
		else R=mid-1;
	}  
	return L;
}
int main(){
	int j;
	len=1;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	b[1]=a[1];
	for(int i=2;i<=n;i++){
		if(a[i]>b[len]){
			b[++len]=a[i];
		}
		else{
			j=find(a[i]);
			b[j]=a[i];
		}
	}
	printf("%d",len);
    return 0;
}

自言自语

真的就是自言自语啦。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 最长上升子序列–二分查找
  • 自言自语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档