zoukankan      html  css  js  c++  java
  • 算法面试题 之 最长递增子序列 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);
        }
  • 相关阅读:
    Eclipse安装Git插件及简单操作
    物联网架构成长之路(28)-Docker练习之MQ中间件(Kafka)
    版本分支管理标准
    社交的基本逻辑
    委托投资方案
    印钞机 V1.0(量化选基总结)
    中小研发团队架构实践之总体架构设计
    FOF 全面科普贴(转载)
    DUIR Framework 相关技术介绍
    使用融资的心得和教训
  • 原文地址:https://www.cnblogs.com/cart55free99/p/4415950.html
Copyright © 2011-2022 走看看