【leetcode】300.最长递增子序列

48 阅读1分钟

leetcode-300.png

动态规划解法(时间复杂度:O(n^2))

  1. 使用一个数组 dp,其中 dp[i] 表示以 nums[i] 结尾的最长递增子序列的长度。
  2. 对于每一个 i,我们遍历之前的所有元素 j,如果 nums[j] < nums[i],则更新 dp[i] 的值为 dp[j] + 1
  3. 最后,dp 数组中的最大值即为整个数组的最长递增子序列长度。
var lengthOfLIS = function (nums) {
    let n = nums.length
    let dp = new Array(n).fill(1)
    let res = 1
    for (let i = 1; i < n; ++i) {
        for (let j = 0; j < i; ++j) {
            if (nums[j] < nums[i]) {
                // 对于长度为 i 的数组,满足里面有多少个都小于 i 的
                // 更新 dp 数组
                dp[i] = Math.max(dp[i], dp[j] + 1)
            }
        }
        res = Math.max(dp[i], res)
    }
    return res
};