一个数组求其最长递增子序列(LIS)

例如数组{3, 1, 4, 2, 3, 9, 4, 6}的LIS是{1, 2, 3, 4, 6},长度为5,假设数组长度为N,求数组的LIS的长度,

需要一个额外的数组 LIS 来记录

长度从1 到 n 慢慢变长求解的过程中 对应长度的 最长递增子序列的最小的末尾元素

解决方法

长度为1时 {3}:

将3放入LIS中,表示长度为1的时候,{3}数组的最长递增子序列的最小微元素

LIS:{3}

只有一个元素,所以 最长递增子序列就是 {3},最长递增子序列的最小尾元素 就是3

长度为2时 {3,1}:

新加入的元素1<3 长度增加变成2时,新加入的元素1比长度为1的时候的 最长递增子序列的最小尾元素还小,所以新加入元素1不会引起最长递增子序列变长,所以需要将1 插入 LIS中,在LIS中找到最小的比1大的元素,替换该元素,完成长度为2 的时候 最长递增子序列的寻找,

LIS:{1}

1替换掉3 表示 在长度为2的时候{3,1}的最长递增子序列的最小尾元素是1,验证 最长递增子序列{1}或{3}

长度为3时 {3,1,4}:

新加入的元素4>1,新加入的元素,比长度为2时的最长递增序列的最小尾元素大,说明新加入元素可以引起最长递增序列的增长,加入新元素4得:

LIS:{1,4}

验证 最长递增序列 {3,4} 或者 {1,4}

长度为4时 {3,1,4,2}:

新加入元素2<4, 比长度为3时的最长递增子序列的最小尾元素小,说明不引起最长递增序列的增长,需要在LIS中找到替换的元素 找到第一个比2大的元素4替换,这样在保证递增序列数量不变的情况下,将递增序列的范围往小值方向移动。得

LIS:{1,2}

验证 最长递增序列 {3,4} 或者 {1,2}

长度为5时 {3,1,4,2,3}:

新加入元素3>2, 比长度为4时的最长递增子序列的最小尾元素大,说明引起最长递增序列的增长,得

LIS:{1,2,3}

验证 最长递增序列 {1,2,3}

长度为6时 {3,1,4,2,3,9}:

新加入元素9>3, 比长度为5时的最长递增子序列的最小尾元素大,说明引起最长递增序列的增长,得

LIS:{1,2,3,9}

验证 最长递增序列 {1,2,3,9}

长度为7时 {3,1,4,2,3,9,4}:

新加入元素4<9, 比长度为3时的最长递增子序列的最小尾元素小,说明不引起最长递增序列的增长,需要在LIS中找到替换的元素 找到第一个比4大的元素9替换,这样在保证递增序列数量不变的情况下,将增序列的范围往小值方向移动。得

LIS:{1,2,3,4}

验证 最长递增序列  {1,2,3,4}

长度为8时 {3,1,4,2,3,9,4,6}:

新加入元素6>4, 比长度为7时的最长递增子序列的最小尾元素大,说明引起最长递增序列的增长,得

LIS:{1,2,3,4,6}

验证 最长递增序列  {1,2,3,4,6}

需要注意:

LIS保存的是 求解的过程中 对应长度的 最长递增子序列的最小的末尾元素 不一定就是最长递增序列原来的序列

插入新元素寻找替换位置的时候 有序查找可以使用二分查找 时间复杂度 o(LogN)

所以该解决方法的时间复杂度NlogN

空间复杂度 N

一个数组求其最长递增子序列(LIS)的更多相关文章

  1. 动态规划 - 最长递增子序列(LIS)

    最长递增子序列是动态规划中经典的问题,详细如下: 在一个已知的序列{a1,a2,...,an}中,取出若干数组组成新的序列{ai1,ai2,...,aim},其中下标i1,i2,...,im保持递增, ...

  2. 算法之动态规划(最长递增子序列——LIS)

    最长递增子序列是动态规划中最经典的问题之一,我们从讨论这个问题开始,循序渐进的了解动态规划的相关知识要点. 在一个已知的序列 {a1, a 2,...an}中,取出若干数组成新的序列{ai1, ai ...

  3. 最长递增子序列 LIS 时间复杂度O(nlogn)的Java实现

    关于最长递增子序列时间复杂度O(n^2)的实现方法在博客http://blog.csdn.net/iniegang/article/details/47379873(最长递增子序列 Java实现)中已 ...

  4. 最长回文子序列LCS,最长递增子序列LIS及相互联系

    最长公共子序列LCS Lintcode 77. 最长公共子序列 LCS问题是求两个字符串的最长公共子序列 \[ dp[i][j] = \left\{\begin{matrix} & max(d ...

  5. 2.16 最长递增子序列 LIS

    [本文链接] http://www.cnblogs.com/hellogiser/p/dp-of-LIS.html [分析] 思路一:设序列为A,对序列进行排序后得到B,那么A的最长递增子序列LIS就 ...

  6. 动态规划(DP),最长递增子序列(LIS)

    题目链接:http://poj.org/problem?id=2533 解题报告: 状态转移方程: dp[i]表示以a[i]为结尾的LIS长度 状态转移方程: dp[0]=1; dp[i]=max(d ...

  7. 编程之美 set 7 求数组中的最长递增子序列

    解法 1. 假设在目标数组 array[] 的前 i 个元素中, 最长递增子序列的长度为 LIS[i] 那么状态转移方程为 LIS[i] = max(1, LIS[k]+1) array[i+1] & ...

  8. 最长递增子序列LIS再谈

    DP模型: d(i) 以第 i 个元素结尾的最长递增子序列的长度. 那么就有 d(i) = max(d(j)) + 1;(j<i&&a[j]<a[i]),答案 max(d( ...

  9. 算法面试题 之 最长递增子序列 LIS

    找出最长递增序列 O(NlogN)(不一定连续!) 参考 http://www.felix021.com/blog/read.php?1587%E5%8F%AF%E6%98%AF%E8%BF%9E%E ...

随机推荐

  1. leetcode-0101 对称二叉树

    题目地址 https://leetcode-cn.com/problems/symmetric-tree/ 1.递归 本题最简单的思路是递归,可以假设两棵一模一样的树在进行镜像对比.他们之间的关系满足 ...

  2. HTTPie:替代 Curl 和 Wget 的现代 HTTP 命令行客户端

    HTTPie 工具是现代的 HTTP 命令行客户端,它能通过命令行界面与 Web 服务进行交互. -- Magesh Maruthamuthu 大多数时间我们会使用 curl 命令或是 wget 命令 ...

  3. React Hooks: useCallback理解

    useCallback把匿名回调“存”起来 避免在component render时候声明匿名方法,因为这些匿名方法会被反复重新声明而无法被多次利用,然后容易造成component反复不必要的渲染. ...

  4. python数据结构之栈的构建

    class Stack(object): def __init__(self): self.stack=[] def pop(self): return self.stack.pop() def pu ...

  5. Java Web教程——检视阅读

    Java Web教程--检视阅读 参考 java web入门--概念理解.名词解释 Java Web 教程--w3school 蓝本 JavaWeb学习总结(一)--JavaWeb开发入门 小猴子mo ...

  6. Apk优化极致

    1. webp WebP格式,谷歌(google)开发的一种旨在加快图片加载速度的图片格式.图片压缩体积大约只有JPEG的2/3,并能节省大量的服务器宽带资源和数据空间.Facebook Ebay等知 ...

  7. PHP 使用try catch,捕获异常

    <?php     header('Content-type:text/html;charset=utf-8');    $a = 1;    $b = 2;    try {        / ...

  8. Python3 字符串格式化(%操作符)

    格式符 格式符为真实值预留位置,并控制显示的格式.格式符可以包含有一个类型码,用以控制显示的类型,如下: %s    字符串 (采用str()的显示) %r    字符串 (采用repr()的显示) ...

  9. 小猪的Python学习之旅 —— 16.再尝Python数据分析:采集拉勾网数据分析Android就业行情...

    一句话概括本文: 爬取拉钩Android职位相关数据,利用numpy,pandas和matplotlib对招人公司 情况和招聘要求进行数据分析. 引言: 在写完上一篇<浅尝Python数据分析: ...

  10. JVM调优方法笔记

    1.性能工具介绍 jvisualvm jmap jstat jstack/threaddump jprofiler jmeter 2.性能调优4步骤 重现问题 定位问题 模拟问题 解决问题 http: ...