LeetCode——300. 最长递增子序列(动态规划)

题目描述

image.png

解题思路

最长递增子序列的核心就是动态规划,核心是搞懂dp数组的每个元素代表的含义。dp[i]表示的是从第0个位置到第i个位置上的最长递增子序列的个数。

  1. 构建一个数组dp,初始值是1。
  2. 从第二个位置开始遍历数组。
  3. 进入循环后先另第i个位置为1。
  4. 循环i之前的元素,一旦出现比第i个位置的元素小的元素就开始比较,更新dp。

AC代码

var lengthOfLIS = function(nums) {
    
    
  // 最长递增子序列是动态规划的经典应用
  const dp = [1];
  for (let i = 1; i < nums.length; i++) {
    
    
    dp[i] = 1;
    for (let j = 0; j < i; j++) {
    
    
      nums[i] > nums[j] && (dp[i] = Math.max(dp[i], dp[j] + 1));
    }
  }
  return Math.max(...dp);
};

思考与总结

首先,最长递增子序列,中的序列二字如何理解,序列值得是可以不连续的,也就是说我们的代码只要能够找到给定数组中的最长递增的一组数即可,其实这类题目的本质就是考察动态规划,当前元素之前的最长递增子序列加上当前就是最长递增子序列,这也是整个动态规划的核心,因此,要想搞懂动态规划,必须深刻理解动态方程,理解dp[i]的含义,尤其是当我们拿到一个新题目没有思路的时候,就可以去理解动态方程的含义,然后跟着代码走一遍流程便可以理解这个题解。类似的题目还有很多,动态规划是面试中必考题之一,同时工作中也经常需要用到他们,动态规划可以说是开发者的基本功之一。

猜你喜欢

转载自blog.csdn.net/sinat_41696687/article/details/125273428
今日推荐