300. 最长递增子序列

300. 最长递增子序列

思路与方法

定义\(dp[i]\)为考虑前i个元素,以第i个元素为结尾的最长上升子序列的长度。nums[i]必须包含
我们从小到大计算\(dp\)数组的值。在计算\(dp[i]\)之前,
假设我们已经计算出了\(dp[0 \dots i-1]\)的值,则状态转移方程为:
\(dp[i] = max(dp[j]) + 1\), 其中\(0 \leq j \le i-1\)\(nums[i] > nums[j]\)
最后,整个数组的最长上升子序列即为所有\(dp[i]\)中的最大值:
\(LISlen = max(dp[i])\)

代码如下:
class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int ans = 0;
        int len = nums.size();
        vector<int> dp(len);  //dp数组的含义:以nums[i]为结尾的最长上升子序列的长度 nums[i]必须包括
        for(int i=0;i<len;i++){
            dp[i] = 1;  //初始化
            //然后考虑之前已知的数据
            for(int j=0;j<i;j++){
                if(nums[i] > nums[j]){//严格递增
                    dp[i] = max(dp[i],dp[j]+1);  //挑选出来最大的那个 4+1 5+1 1+1
                }
            }
            ans = max(ans,dp[i]);
        }  
        return ans;
    }
};
复杂度分析
  • 时间复杂度:\(O(n^{2})\).
  • 空间复杂度:\(O(n)\).
posted @ 2021-03-04 16:05  focusDing  阅读(67)  评论(0编辑  收藏  举报