一个数组求其最长递增子序列(LIS)
一个数组求其最长递增子序列(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)的更多相关文章
- 动态规划 - 最长递增子序列(LIS)
最长递增子序列是动态规划中经典的问题,详细如下: 在一个已知的序列{a1,a2,...,an}中,取出若干数组组成新的序列{ai1,ai2,...,aim},其中下标i1,i2,...,im保持递增, ...
- 算法之动态规划(最长递增子序列——LIS)
最长递增子序列是动态规划中最经典的问题之一,我们从讨论这个问题开始,循序渐进的了解动态规划的相关知识要点. 在一个已知的序列 {a1, a 2,...an}中,取出若干数组成新的序列{ai1, ai ...
- 最长递增子序列 LIS 时间复杂度O(nlogn)的Java实现
关于最长递增子序列时间复杂度O(n^2)的实现方法在博客http://blog.csdn.net/iniegang/article/details/47379873(最长递增子序列 Java实现)中已 ...
- 最长回文子序列LCS,最长递增子序列LIS及相互联系
最长公共子序列LCS Lintcode 77. 最长公共子序列 LCS问题是求两个字符串的最长公共子序列 \[ dp[i][j] = \left\{\begin{matrix} & max(d ...
- 2.16 最长递增子序列 LIS
[本文链接] http://www.cnblogs.com/hellogiser/p/dp-of-LIS.html [分析] 思路一:设序列为A,对序列进行排序后得到B,那么A的最长递增子序列LIS就 ...
- 动态规划(DP),最长递增子序列(LIS)
题目链接:http://poj.org/problem?id=2533 解题报告: 状态转移方程: dp[i]表示以a[i]为结尾的LIS长度 状态转移方程: dp[0]=1; dp[i]=max(d ...
- 编程之美 set 7 求数组中的最长递增子序列
解法 1. 假设在目标数组 array[] 的前 i 个元素中, 最长递增子序列的长度为 LIS[i] 那么状态转移方程为 LIS[i] = max(1, LIS[k]+1) array[i+1] & ...
- 最长递增子序列LIS再谈
DP模型: d(i) 以第 i 个元素结尾的最长递增子序列的长度. 那么就有 d(i) = max(d(j)) + 1;(j<i&&a[j]<a[i]),答案 max(d( ...
- 算法面试题 之 最长递增子序列 LIS
找出最长递增序列 O(NlogN)(不一定连续!) 参考 http://www.felix021.com/blog/read.php?1587%E5%8F%AF%E6%98%AF%E8%BF%9E%E ...
随机推荐
- wget下载整个网站---比较实用--比如抓取Smarty的document
wget下载整个网站可以使用下面的命令 wget -r -p -k -np http://hi.baidu.com/phps, -r 表示递归下载,会下载所有的链接,不过要注意的是,不要单独使用这个参 ...
- IDEA 之 ERROR:无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]
问题描述:在使用IDEA对JSTL进行测试时出现error:无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core] ...
- 源码学习VUE之Observe
在文章 源码学习VUE之响应式原理我们大概描述了响应式的实现流程,主要写了observe,dep和wather的简易实现,以及推导思路.但相应代码逻辑并不完善,今天我们再来填之前的一些坑. Obser ...
- SpringMVC Root WebApplicationContext启动流程
传统的SpringMVC项目中,需要在web.xml中配置Contextlistener.ContextLoaderListener是负责引导启动和关闭Spring的Root上下文的监听器.主要将处理 ...
- C语言基础知识总结
知识点的回忆与巩固 一. 条件分支结构 1.if分支语句 2.switch语句 二.循环体部分知识点整理 1.for循环 2.while循环-适合不确定循环次数时使用 三.字符串与数组 数组的操作 1 ...
- 图论--割点--Tarjan
#include<iostream> #include<stdio.h> #include<vector> using namespace std; const i ...
- CodeForces - 260B
A recently found Ancient Prophesy is believed to contain the exact Apocalypse date. The prophesy is ...
- 疯子的算法总结(九) 图论中的矩阵应用 Part 2 矩阵树 基尔霍夫矩阵定理 生成树计数 Matrix-Tree
定理: 1.设G为无向图,设矩阵D为图G的度矩阵,设C为图G的邻接矩阵. 2.对于矩阵D,D[i][j]当 i!=j 时,是一条边,对于一条边而言无度可言为0,当i==j时表示一点,代表点i的度. 即 ...
- AWVS 安全渗透扫描
1.打开软件,点击 New Scan 2.在 website url 中输入被扫描的网址,点击 next 3.在 scanning profile 中选择测试的漏洞类型,默认选择 default(默认 ...
- Java采用反射技术创建对象后对目标类的成员变量和成员方法进行访问
实现: package com.ljy; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * * @Class ...