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

题目
leetcode原题链接
思路
- 设
dp[i]
表示以i这个位置数字为结尾的最长升序子序列的长度 dp[i]
与dp[j] (0 <= j < i)
的关系:对于每一个dp[j]
,if(nums[i] > nums[j]) dp[i] = Math.max(dp[i] , dp[j] + 1)
- 初始化,对于每一个i,
dp[i]
至少等于1(即最长升序子序列),故每一项初始化为1 - 由于
dp[i]
依赖于前面的每一项,故从前向后遍历 - 返回dp数组中的最大值,而不是最后一项
代码
/**
* @param {number[]} nums
* @return {number}
*/
var lengthOfLIS = function(nums) {
let len = nums.length
let dp = new Array(len).fill(1)
let res = 1
for(let i = 1 ; i < len ; i++){
for(let j = 0 ; j < i ; j++){
if(nums[i] > nums[j]){
dp[i] = Math.max(dp[i] , dp[j] + 1)
}
}
res = Math.max(res , dp[i])
}
return res
};
复杂度
- 时间复杂度: O ( n 2 ) O(n^2) O(n2)
- 空间复杂度: O ( n ) O(n) O(n)
关注我的专栏,每天更新三道leetcode题解,一起变强!