代码随想录算法训练营第五十六天 | LeetCode 300、674、718

文章目录

  • 前言
  • 一、300
  • 二、674
  • 三、718
  • 总结


前言

LeetCode题目:LeetCode 300、674、718
Takeaway:动态规划的子序列系列问题


一、300

动态规划的子序列系列问题,元素不是连续的,所以DP状态转移公式是 max()

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {

        // 边界值处理
        if(nums.size() == 1){
            return 1;
        }

        // 定义DP数组,其含义是第 i 个元素最大子序列, 这题初始化很重要!
        vector<int> dp(nums.size(), 1);

        int ans = 0;

        for(int i=1; i<nums.size(); i++){
            for(int j=0; j<i; j++){
                if(nums[i]>nums[j]){
                    dp[i] = max(dp[i], dp[j]+1); // DP 状态转移公式
                }
                if(dp[i] > ans){
                    ans = dp[i]; //记录结果
                }
            }
        }

        return ans;
    }
};

二、674

动态规划的子序列系列问题,元素是连续的,所以DP状态转移公式是 +1

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {

        // 边界值处理
        if(nums.size() == 1){
            return 1;
        }
        
        // 定义DP数组,其含义是第 i 个元素最大子序列, 这题初始化很重要!
        vector<int> dp(nums.size(), 1);

        int ans = 0;

        for(int i=1; i<nums.size(); i++){
            if(nums[i]>nums[i-1]){
                dp[i] = dp[i-1]+1;
            }
            if(dp[i]>ans){
                ans = dp[i];
            }
        }

        return ans;
    }
};

三、718

动态规划的子序列系列问题,元素是连续的,所以DP状态转移公式是 +1,这题的特点是两个数组找共同子序列,所以DP数组是2维的,别的没什么了。

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {

        // 边界值处理
        if(nums1.size() == 1 || nums2.size() == 1){
            return 1;
        }

        // DP数组含义:以 i-1 和 j-1 结尾的数组,最大公共子序列是多长
        vector<vector<int>> dp(nums1.size()+1, vector(nums2.size()+1, 0));

        int ans = 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;
                }
                if(dp[i][j] > ans){
                    ans = dp[i][j];
                }
            }
        }

        return ans;
    }
};

总结

动态规划的子序列系列问题,感觉和之前的股票问题区别不是很大。

你可能感兴趣的:(随想录刷题,算法,leetcode,动态规划)