leetcode300. Longest Increasing Subsequence 最长递增子序列 、674. Longest Continuous Increasing Subsequence

 Longest Increasing Subsequence 最长递增子序列

 子序列不是数组中连续的数。

dp表达的意思是以i结尾的最长子序列,而不是前i个数字的最长子序列。

初始化是dp所有的都为1,最终的结果是求dp所有的数值的最大值。

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int length = nums.size();
        if(length <= 0)
            return 0;
        vector<int> dp(length,1);
        int max_num;
        for(int i = 1;i < length;i++){
            max_num = 1;
            for(int j = i - 1;j >= 0;j--){
                if(nums[i] > nums[j])
                    max_num = max(max_num,dp[j] + 1);
            }
            dp[i] = max_num;
        }
        max_num = 1;
        for(int i = 0;i < length;i++){
            if(dp[i] > max_num)
                max_num = dp[i];
        }
        return max_num;
    }
};

674. Longest Continuous Increasing Subsequence

相对于最长递增子序列来说,这个题目更加简单,只需要比较前一个数字就好,不用把前面的数字都比较完。因为如果比前一个小,直接就无法完成递增,只能保持当前的值1;如果比前一个数字大,其实前一个数字就已经计算了之前递增的个数,直接加1就好了

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
        if(nums.empty())
            return 0;
        int length = nums.size();
        vector<int> dp(length,1);
        for(int i = 1;i < length;i++){
            if(nums[i] > nums[i-1])
                dp[i] = dp[i-1] + 1;
        }
        int max_num = 1;
        for(int i = 0;i < length;i++)
            max_num = max(max_num,dp[i]);
        return max_num;
    }
};
原文地址:https://www.cnblogs.com/ymjyqsx/p/9567417.html