• 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;
        }
    };
    
  • 相关阅读:
    一个泛型的单例模式
    一个将Object转化为CSV文件的类
    WSDL.EXE Error: Not enough storage is avaliable to process the command.
    一个Linq Group By 和Sum的范例
    Random Cube Algorithm
    AccessImport demo
    .net controls of FileUpload
    asp.net AJAX
    Deploy iis7.5
    C# Fibonacci Sequence
  • 原文地址:https://www.cnblogs.com/linrj/p/13572680.html
Copyright © 2020-2023  润新知