leetcode

题目

输入一个无序的整数数组,请你找到其中最长递增子序列的长度。

例如:输入nums = [10, 9, 2, 5, 3, 7, 101, 18],其中最长的递增子序列是[2, 3, 7, 101],所以输出4

思路:动态规划

  • 定义dp[i]表示以nums[i]这个数结尾的最长递增子序列长度
  • base case: dp[i]初始值为1
  • dp[i]的值等于 在前n-1个中第j个 递增子序列长度 + 1,j要满足要满足nums[i] > nums[j],存在多种情况,取最大值
  • dp数组中的最大值就是整个nums最长递增子序列的长度

解法

  1. /**
  2. * @param {number[]} nums
  3. * @return {number}
  4. */
  5. var lengthOfLIS = function(nums) {
  6. // dp[i]表示以nums[i]这个数结尾的最长递增子序列长度,初始化为1
  7. const dp = new Array(nums.length).fill(1)
  8. for (let i = 0; i < nums.length; i ++) {
  9. for (let j = 0; j < i; j++) {
  10. // dp[i] 的值等于第j个递增子序列长度 + 1(j要满足nums[i] > nums[j])
  11. // 存在多种情况,取最大值
  12. if (nums[i] > nums[j]) {
  13. dp[i] = Math.max(dp[i], dp[j] + 1)
  14. }
  15. }
  16. }
  17. return Math.max(...dp)
  18. };