LeetCode300. 最长上升子序列

用dp[i]记录以nums[i]结尾的最长上升子序列的长度。
遍历数组,对于一个数,从开头遍历到这个数的前一个数,如果存在一个(0 <= j <= i - 1),nums[j] < nums[i] 且 dp[j] > 1,
则可以考虑更新dp[i] -> dp[i] = max(dp[i], dp[j] + 1); 表示nums[i]加在nums[j]后面组成了一个新的上升子序列,
当然,如果这个上升子序列的长度不如原来那个以nums[i]结尾的子序列的长度,则dp[i]长度还是原来的子序列的长度。

如果nums[j]比nums[i]大,则nums[i]不能接在nums[j]后面组成一个上升子序列,则dp[i]不变 -> dp[i] = max(1, dp[i);
1表示nums[i]自己组成了一个上升子序列,显然这个子序列长度为1.

再用一个变量res记录最长的上升子序列的长度,每次更新dp[i]的时候也更新一下res -> res = max(res, dp[i]);

代码如下:

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int size = nums.size();
        if(size == 0) {
            return 0;
        }
        vector<int> dp(size);                              // dp[i]表示以nums[i]作为结尾的最长上升子序列的最大长度
        dp[0] = 1;
        int res = 1;                                       // res是整个数组中最长的上升子序列的长度,最少也是1,表示最长上升子序列只有一个数
        for(int i = 1; i < size; ++i) {
            for(int j = 0; j < i; ++j) {
                if(nums[i] > nums[j]) {
                    dp[i] = max(dp[i], dp[j] + 1);
                } else {
                    dp[i] = max(1, dp[i]);
                }
            }
            res = max(res, dp[i]);
        }
        return res;
    }
};
posted @ 2020-08-27 17:33  machine_gun_lin  阅读(122)  评论(0编辑  收藏  举报