找出最长递增序列 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);
}

最新文章

  1. apache 配虚拟主机转发到tomcat
  2. chrome的常用快捷键和命令
  3. HTML 学习笔记(链接)
  4. Uva-------(11462) Age Sort(计数排序)
  5. Ubuntu下fcitx安装。(ibus不会用)
  6. C#操作ini
  7. 行业百科知识--Github
  8. POJ 2778 AC自己主动机+矩阵幂 不错的题
  9. RH133读书笔记(7)-Lab 7 Advanced Filesystem Mangement
  10. PHP支付接口RSA验证
  11. Spring+SpringMVC+MyBatis+easyUI整合基础篇(二)牛刀小试
  12. WAS集群系列(2):数据库连接低级错误——网络连接问题
  13. c语言贪吃蛇详解4.食物的投放与蛇的变长
  14. Android官方命令深入分析之bmgr
  15. es ik分词插件安装
  16. SQLServer 2014 内存优化表
  17. 将分支代码合并到master和将master代码合并到dev
  18. RSA 算法
  19. 整合Yolov3到游戏引擎
  20. nodejs mongoose populate 多层模型

热门文章

  1. Oracle中针对中文进行排序[Z]
  2. 原来你是个这样的JVM
  3. TCP/IP详解之:ARP协议 和 RARP协议
  4. 《C++ Primer Plus 6th》读书笔记 - 第8章 函数探幽
  5. leetcode Invert Binary Tree python
  6. Latex命令笔记
  7. 函数 setjmp, longjmp, sigsetjmp, siglongjmp
  8. oracle 游标-------转
  9. 剑指offer——已知二叉树的先序和中序排列,重构二叉树
  10. WPF中的触发器简单总结