代码随想录算法训练营第四十九天 | 300.最长递增子序列 674.最长连续递增序列 718.最长重复子数组

300.最长递增子序列

题目链接 文章讲解 视频讲解

动规五部曲:

  • dp[i]: 表示考虑元素i的最长子序列为dp[i]
  • 递推公式:dp[i] = max(dp[j] + 1, dp[i]);
  • 初始化:dp[i] = 1; 每个元素单独算一个子序列长度为1
  • 遍历顺序:从前向后遍历
  • 打印dp数组
class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        // dp[i] 表示考虑i元素最长子序列是dp[i]
        vector<int> dp(nums.size(), 1);
        
        // 递推公式:dp[i] = max(dp[j] + 1, dp[i]);

        // 初始化
        dp[0] = 1;
        int max_val = 1; // 用来记录最长的序列,因为最长的序列长度可能维护在任意一个位置
        for(int i = 0; i < nums.size(); ++i) {
            for(int j = 0; j < i; ++j) {
                if(nums[j] < nums[i]) dp[i] = max(dp[j] + 1, dp[i]);
                max_val = max(dp[i], max_val);
            }
        } 
        for(int val : dp) cout << val << " ";
        return max_val;
    }
};

674.最长连续递增序列

题目链接 文章讲解 视频讲解

思路:只要nums[i-1] < nums[i]则dp[i] = dp[i-1] + 1;

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
        // dp[i]: 表示考虑i元素的最长连续递增子序列为dp[i]
        vector<int> dp(nums.size(), 1);        
       
        // 递推公式dp[i] = dp[i - 1] + 1;
        
        // 初始化dp[i] = 1;

        int max_val = 1;
        // 遍历
        for(int i = 1; i < nums.size(); ++i) {
            if(nums[i] > nums[i - 1]) dp[i] = dp[i-1] + 1;
            max_val = max(dp[i], max_val);
        }
        
        for(int val : dp) cout << val << " ";
        return max_val;
    }
};

718.最长重复子数组

题目链接 文章讲解 视频讲解

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        // dp[i][j]: 表示nums1的i-1位置和nums2的j-1位置的最长重复子数组的长度
        vector<vector<int>> dp(nums1.size() + 1, vector<int>(nums2.size() + 1, 0));

        // 递推公式:if(nums1[i] == nums2[j]) dp[i][j] = dp[i-1][j-1] + 1;

        // 初始化:因为dp[i][j] 只依赖于dp[i-1][j-1]和其他位置,而长度又是从0开始累加的,所以均初始化为0

        int max_len = 0;    
        // 遍历
        for(int i = 1; i <= nums1.size(); ++i) {
            for(int j = 1; j <= nums2.size(); ++j) {
                if(nums1[i-1] == nums2[j-1]) dp[i][j] = dp[i-1][j-1] + 1;
                max_len = max(max_len, dp[i][j]);
            } 
        }
        for(auto vec : dp) {
            for(int val : vec) cout << val << " ";
            cout << endl;
        }
        return max_len;
    }
};
posted @ 2024-07-04 21:30  深蓝von  阅读(1)  评论(0编辑  收藏  举报