给你一个整数数组
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)