博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编程之美 set 7 求数组中的最长递增子序列
阅读量:5133 次
发布时间:2019-06-13

本文共 694 字,大约阅读时间需要 2 分钟。

解法

1. 假设在目标数组 array[] 的前 i 个元素中, 最长递增子序列的长度为 LIS[i]

那么状态转移方程为

LIS[i] = max(1, LIS[k]+1) array[i+1] > array[k], for any k <= i

按照这个动规的思路, 每次求 LIS[i] 是都要遍历 LIS[0] ~ LIS[i]

时间复杂度为 o(n^2)

 

2. (1) 是一个比较一般性的解法. 考虑下面一个例子

目标序列为 1, -1, 2, -3, 4, -5, 6, 当 i = 4 时, 最长的递增序列是 (1,2), (-1,2) 那么 4 > 2, 就可以直接把 4 加到前面的子序列中形成一个新的递增子序列

受此启发, 我们希望找到前 i 个元素中的一个递增子序列, 使得这个递增子序列的最大元素比 array[i+1] 要小, 且长度尽可能的长. 这样将 array[i+1] 加在该递增子序列后, 便可找到以 array[i+1] 为最大元素的最长递增子序列

长度为 1 的递增子序列最大元素的最小值为 MAXV[1] (最大元素是指长度为 i 的序列中最后一个元素, 最小值是指满足长度为 i 的所有序列中第 i 个值最小的那个)

...

长度为 LIS[i] 的递增子序列最大元素的最小值为 MAXV[LIS[i]]

假如有了这些值, 那么可以倒序的查找, 更新

MAXV[] 是一个递增数组, 可以使用二分查找法, 因此时间复杂度降低到 NlogN

 

转载于:https://www.cnblogs.com/xinsheng/p/3565134.html

你可能感兴趣的文章
js-格式化数字保留两位小数-带千分符
查看>>
【Java】forward & redirect 的差异
查看>>
Java学习笔记--字符串和文件IO
查看>>
【BZOJ1951】古代猪文(CRT,卢卡斯定理)
查看>>
poj 2823 线段树
查看>>
转 Silverlight开发历程—(画刷与着色之线性渐变画刷)
查看>>
SQL语法(3)
查看>>
在js在添版本号
查看>>
C++中map的用法
查看>>
图的遍历
查看>>
信息安全系统设计基础实验三
查看>>
Change log data for DSO
查看>>
maven下载,安装与eclipse中maven配置
查看>>
Java模板引擎 FreeMarker介绍1
查看>>
解决Dialog 消失,输入法不消失的问题
查看>>
css3为图片添加鼠标移入放大效果
查看>>
day 5 作业
查看>>
第1节 flume:15、flume案例二,通过自定义拦截器实现数据的脱敏
查看>>
Java中抽象类和接口的区别
查看>>
Linux(CentOS)下安装Elasticsearch5.0.0
查看>>