LeetCode 300 最长上升子序列

一,问题描述

二,问题分析

1.定义状态:memo[i] :表示以第i个数字结尾的最长上升子序列的长度

2.初始状态:memo[i] :都为1,表示本身的长度

3.状态的转移:memo[i] = max(memo[i] , memo[j] +1)      nums[j]<nums[i]

意思是在第 i 个数字之前如果有一个数字小于第 i 个数字,意味着满足上升序列的要求,再比较现在第i个位置的长度和第j个位置的长度+1,取较大值

三,代码解答

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        //memo[i] : 以nums[i]结尾的最长上升子序列长度
        vector<int> memo(nums.size(),1);
        for(int i=0;i<nums.size();i++){        //第一个循环,更新memo数组
            for(int j=i-1;j>=0;j--){            //尝试是否更新memo数组
                if(nums[j] < nums[i]){
                    memo[i] = max(memo[i], memo[j]+1);
                }
            }
        }
        int res = 0;
        for(int i=0;i<nums.size();i++){    //找出memo数组的中最大值,即为最长上升子序列长度
            res = max(res,memo[i]);
        }
        return res;    
    }
};
发布了54 篇原创文章 · 获赞 14 · 访问量 3571

猜你喜欢

转载自blog.csdn.net/q2511130633/article/details/105256324