算法面试题 之 最长递增子序列 LIS
找出最长递增序列 O(NlogN)(不一定连续!)
参考 http://www.felix021.com/blog/read.php?1587%E5%8F%AF%E6%98%AF%E8%BF%9E%E6%95%B0%E7%BB%84%E9%83%BD%E6%B2%A1%E7%BB%99%E5%87%BA%E6%9D%A5
我就是理解了一下他的分析 用更通俗易懂的话来说说
题目是这样 d[1..9] = 2 1 5 3 6 4 8 9 7 要求找到最长的递增子序列
首先用一个数组b[] 依次的将d里面的元素丢进去 b的作用是用来记录当前最长递增子序列
先丢入2 到 b中
[2] 此时 在已知一个元素2 的情况下 最长递增子序列就是 [2]
丢入1
[2 1] 发现此时最长递增子序列就是 1 因为 2 1 不构成递增
且删除比加入的新元素小得元素 也就是删除2
那么又是 [1] 了
丢入5
[1 5]
丢入3
[1 5 3] 又出现了不递增的情况 上面说了 b是用来记录目前元素递增子序列的 所以b里面应该是递增才对
删除比加入的新元素小得元素 也就是5 得到 [1 3] ---- 此时递增子序列长度为2
丢入6
[1 3 6]
丢入4
[1 3 6 4 ] ---> [1 3 4] ----length 3
丢入8
[1 3 4 8] ---- length 4
丢入9
[1 3 4 8 9] ----length 5
丢入7
[1 3 4 8 9 7] ----> [1 3 4 7] --- length 4
那么由此一来 最大递增子序列已经找到 1 3 4 8 9
var arr = [2, 1, 5, 3, 6, 4, 8, 9, 7];
lis(arr); function lis(arr) {
var currentLis = [];
var maxLis = [];
for (var i = 0; i < arr.length; i++) {
currentLis.push(arr[i]);
var tmp = [].concat(currentLis);
currentLis.forEach(function(item, idx) {
if (item > arr[i]) {
tmp.splice(idx, 1);
console.log('array is ' + tmp);
}
});
currentLis = [].concat(tmp);
if (currentLis.length > maxLis.length) {
maxLis = [].concat(currentLis);
}
}
console.log(maxLis);
}
算法面试题 之 最长递增子序列 LIS的更多相关文章
- 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 ...
- 最长回文子序列LCS,最长递增子序列LIS及相互联系
最长公共子序列LCS Lintcode 77. 最长公共子序列 LCS问题是求两个字符串的最长公共子序列 \[ dp[i][j] = \left\{\begin{matrix} & max(d ...
- 一个数组求其最长递增子序列(LIS)
一个数组求其最长递增子序列(LIS) 例如数组{3, 1, 4, 2, 3, 9, 4, 6}的LIS是{1, 2, 3, 4, 6},长度为5,假设数组长度为N,求数组的LIS的长度, 需要一个额外 ...
- 动态规划 - 最长递增子序列(LIS)
最长递增子序列是动态规划中经典的问题,详细如下: 在一个已知的序列{a1,a2,...,an}中,取出若干数组组成新的序列{ai1,ai2,...,aim},其中下标i1,i2,...,im保持递增, ...
- 最长递增子序列LIS再谈
DP模型: d(i) 以第 i 个元素结尾的最长递增子序列的长度. 那么就有 d(i) = max(d(j)) + 1;(j<i&&a[j]<a[i]),答案 max(d( ...
- 算法之动态规划(最长递增子序列——LIS)
最长递增子序列是动态规划中最经典的问题之一,我们从讨论这个问题开始,循序渐进的了解动态规划的相关知识要点. 在一个已知的序列 {a1, a 2,...an}中,取出若干数组成新的序列{ai1, ai ...
- 最长递增子序列 LIS 时间复杂度O(nlogn)的Java实现
关于最长递增子序列时间复杂度O(n^2)的实现方法在博客http://blog.csdn.net/iniegang/article/details/47379873(最长递增子序列 Java实现)中已 ...
- POJ 1836 Alignment 最长递增子序列(LIS)的变形
大致题意:给出一队士兵的身高,一开始不是按身高排序的.要求最少的人出列,使原序列的士兵的身高先递增后递减. 求递增和递减不难想到递增子序列,要求最少的人出列,也就是原队列的人要最多. 1 2 3 4 ...
随机推荐
- sql server 存储过程分隔split
CREATE FUNCTION [dbo].[F_split] ( ), ) ) , ), f )) --实现split功能 的函数 AS BEGIN DECLARE @i INT SET @Sour ...
- 幻世(OurDream)2D图形引擎易语言汉化版更新提示
幻世引擎的易语言汉化专版到目前为止已经累积了多个BUG,其中多个BUG是影响引擎功能使用的问题,我将会在近期发布修复所有问题的更新版本(此更新版本同时也将会支持最新的对加入的粒子系统的支持),敬请各位 ...
- linux命令学习02-通过tomcat学习ps和netstat
问题:如何查找tomcat进程,以及tomcat占用的端口号? 1.ps -ef|grep tomcat root 1984 1 19 10:20 ? 00:00:10 /opt/jdk1.7.0_8 ...
- codeforces 665D Simple Subset
题目链接 给一个数列, 让你选出其中的m个数, 使得选出的数中任意两个数之和都为质数, m尽可能的大. 首先, 除了1以外的任意两个相同的数相加结果都不是质数. 然后, 不考虑1的话, 选出的数的个数 ...
- centos6.5编译android-2.2_froyo的几个问题jdk,gcc,arm-gcc
1.gcc降级 因为之前用QT升级了gcc到4.8.0,现在编译安卓又要降到4.4.6 我这边是直接下的gcc-4.4.6源码安装的 gcc源码安装包下载: ftp://ftp.mpi-sb.mpg. ...
- Python核心编程笔记---- print
在仅用变量名时,输出的字符串是用单引号括起来的.这个是为了让非字符串对象也可能以字符的形式显示在屏幕上. 而print 函数打印出来的是变量的值. print 调用的是str()方法.而仅用变量名时调 ...
- 解密电子书之二:EPD控制芯片
EPD控制芯片大致上相当于计算机的显卡,没了它,所有电子书都变白板.类似显卡中的ATI与NVIDIA,EPD控制芯片中也是两家:Surf(泰信科)和EPSON(爱普生),其中爱普生是最早推出电子纸显示 ...
- git操作标签
操作标签 如果标签打错了,也可以删除: $ git tag -d v0.1 Deleted tag 'v0.1' (was e078af9) 因为创建的标签都只存储在本地,不会自动推送到远程.所以,打 ...
- LNMP : 502 Bad Gateway 解决小记,真正的原因
站点搬迁到新的server.原先一直都是LAMP.如今改为LNMP. 将重写文件 htaccess改成 nginx的 conf.放到了站点.可仅仅能打开首页,其它重写页面一打开都是不停的载入. 载入等 ...
- 赵雅智_BroadcastReceiver
BroadcastReceiver 用于接收程序(包含用户开放的程序和系统内建程序)所发出的Broadcast intent 耗电量 开机启动 窃取别人短信 窃取别人电话 开发: 创建须要启动的Br ...