zoukankan      html  css  js  c++  java
  • vue3 最长递增子序列 diff优化

    //vue3优化版(回头我会完善下算法思路)

    function getSequence(arr) {
        const p = arr.slice()
        const result = [0]
        let i, j, u, v, c
        const len = arr.length
        for (i = 0; i < len; i++) {
            const arrI = arr[i]
            if (arrI !== 0) {
                j = result[result.length - 1]
                if (arr[j] < arrI) {
                    p[i] = j
                    result.push(i)
                    continue
                }
                u = 0
                v = result.length - 1
                while (u < v) {
                    c = ((u + v) / 2) | 0
                    if (arr[result[c]] < arrI) {
                        u = c + 1
                    } else {
                        v = c
                    }
                }
                if (arrI < arr[result[u]]) {
                    if (u > 0) {
                        p[i] = result[u - 1]
                    }
                    result[u] = i
                }
            }
        }
        u = result.length
        v = result[u - 1]
        while (u-- > 0) {
            result[u] = v
            v = p[v]
        }
        return result
    }
    
    console.log(getSequence([10, 9, 2, 5, 3, 7, 101, 18]));
    
    

    //算法原型——基础算法版

    //Objective is to find the longest increasing subsequence in an array.
    
    let nums = [10,9,2,5,3,7,101,18]
    
    
    //O(n^2) solution that uses dynamic programming to figure out if we want the 
    //element in the subsequence or not.
    
    if (nums.length == 0) {
        return 0
    }
    
    //Every element initially starts with a subsequence of length 1
    let dp = new Array(nums.length).fill(1)
    
    //Use a nested iterator to compare all pairs of elements in the array
    for (let i = 0; i < nums.length; i++) {
        for (let j = 0; j < i; j++) {
            //If nums[i] = 5 && nums[j] = 2, then we can choose to add
            //the previous subsequence to the current one
            if (nums[i] > nums[j]) {
                dp[i] = Math.max(dp[i], dp[j] + 1)    
            }
        }
    }
    
    return Math.max(...dp)
    
    
    
  • 相关阅读:
    RocketMQ
    Docker的基本使用
    logstash、ELK
    spring cloud杂文总结
    手写一个starter
    @SpringBootApplication你知多少?
    使用ElasticSearch
    ElasticSearch安装
    啥是ElasticSearch???
    socket、端口、进程的关系
  • 原文地址:https://www.cnblogs.com/ysk123/p/14306479.html
Copyright © 2011-2022 走看看