87.最长递增子序列

48 阅读1分钟

题目链接

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

解法 动态规划

思路

首先思考 dp 数组的定义:

dp[i] 就是以 nums[i] 为结尾的最长的递增子序列,最小的子序列是它自己,所以初始化就应该为 1

dp[i] 只能从 0 开始,所以需要两层循环,内层循环去计算最长的递增子序列长度。

代码

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

时空复杂度

时间复杂度:O(n^2)

空间复杂度:O(n)