最长递增子序列问题

本文详细介绍了如何解决最长递增子序列问题,包括O(n.^2)和O(nlogn)两种解法。O(n.^2)解法中,通过维护dp数组记录以每个元素结尾的最长递增子序列长度,同时使用pre数组保存前一个节点,以便于回溯找到整个序列。O(nlogn)解法的核心是构建len和pre数组,利用二分查找优化查找过程。文章提供了具体的操作步骤和示例。
摘要由CSDN通过智能技术生成

题目描述

给定数组arr,设长度为n,输出arr的最长递增子序列。(如果有多个答案,请输出其中字典序最小的)

输入描述:

输出两行,第一行包括一个正整数n(n<=100000),代表数组长度。第二行包括n个整数,代表数组arr \left(1 \leq arr_i \leq 1e9 \right)(1≤arri​≤1e9)。

输出描述:

输出一行。代表你求出的最长的递增子序列。

示例1

输入

复制

9
2 1 5 3 6 4 8 9 7

输出

复制

1 3 4 8 9

示例2

输入

复制

5
1 2 8 6 4

输出

复制

1 2 4

说明

其最长递增子序列有3个,(1,2,8)、(1,2,6)、(1,2,4)其中第三个字典序最小,故答案为(1,2,4)

最原始的最长递增子序列问题只需要求出最长递增子序列的长度即可,为了能够打印出整个递增子序列,需要额外加一个数组保存序列中的前一个节点。以这个数组为例:

7,1,8,2,9,10,3,1,11

字典序最小的最长递增子序列为:1,2,9,10,11。

首先是传统的O(n.^2)复杂度的解法,dp[i]表示以下标i结尾的最长递增子序列的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值