最长递增子序列

144 阅读1分钟

最长递增子序列

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。在这里插入图片描述

暴力求解

var lengthOfLIS = function (nums) {
    const n = nums.length
    if (n <= 1) {
        return n
    }
    const dp = new Array(n).fill(1)
    let max = 1
    for (let i = 1; i < n; i++) {
        for (let j = i - 1; j >= 0; j--) {
            if (nums[i] > nums[j]) {
                dp[i] = Math.max(dp[i], dp[j] + 1)
            }
        }
        max = Math.max(dp[i], max)
    }
    return max
};

优化求解

var lengthOfLIS = function (nums) {
    const n = nums.length
    if (n <= 1) {
        return n
    }
    const dp = [null, nums[0]]
    let max = 1
    for (let i = 1; i < n; i++) {
        if (dp[max] < nums[i]) {
            dp[++max] = nums[i]
            continue
        }
        let pos = 0;
        let left = 1,
            right = max,
            mid;
        while (left <= right) {
            mid = (left + right) >> 1;
            if (nums[i] > dp[mid]) {
                left = mid + 1;
                pos = mid
            } else {
                right = mid - 1
            }
        }
        dp[pos + 1] = nums[i]
    }
    return max
};