算法面试题 之 最长递增子序列 LIS
2015-04-10 23:24
267 查看
找出最长递增序列 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
参考 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); }
相关文章推荐
- c++算法之最长递增子序列(LIS)
- 【面试题之算法部分】LIS最长递增子序列
- 数据结构与算法学习之路:LIS——最长递增序列的动态规划算法和二分思想算法
- 最长递增子序列(LIS)的O(NlogN)打印算法
- 设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。
- 最长递增子序列 O(NlogN)算法
- 找工作知识储备---数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- hdu 1025 Constructing Roads In JGShining's Kingdom(最长上升子序列(LIS)O(nlogn)算法)
- 最长递增子序列(LIS)
- 算法之最长递增子序列,最长公共子序列
- 最长上升子序列(LIS)算法…
- 【转】最长递增子序列 O(NlogN)算法
- 最长递增子序列 O(NlogN)算法
- 最长递增子序列(LIS)
- 编程之美 最长递增子序列 LIS
- 动态规划-最长递增序列(LIS)【模板】
- 找工作知识储备(2)---数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- UVa 111 - History Grading 最长递增子序列 LIS
- 最长递增子序列(LIS)
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串