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

75 阅读2分钟

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

300. 最长递增子序列

题目链接:300. 最长递增子序列

  • dp含义: 以nume[i]为结尾的最长递增子序列的长度

  • 递推公式:

    • dp[i] = Math.max(dp[i], dp[j] + 1)
  •  class Solution {
     public:
         int lengthOfLIS(vector<int>& nums) {
             int len = nums.size();
            // dp[i] 是指以nums[i]为结尾的最长递增子序列长度
            vector<int> dp(len);
            int res = 1;
     ​
            for (int i = 0; i < len; i++) {
                dp[i] = 1;
            }
     ​
            for (int i = 1; i < len; i++) {
                for(int j = 0; j < i; j++) {
                    if(nums[i] > nums[j]) {
                        dp[i] = max(dp[i], dp[j] + 1);
                    }// 如果小于等于则不更新
                }
                res = max(dp[i], res);
            }
            return res;
         }
     };
    

674. 最长连续递增序列

题目链接:674. 最长连续递增序列

  • dp含义: 以nume[i]为结尾的最长连续递增子序列的长度

  • 递推公式:

    • if (nums[i] > nums[i - 1]) dp[i] = dp[i-1] + 1
  • 双指针法

  •  class Solution {
     public:
         int findLengthOfLCIS(vector<int>& nums) {
             // 双指针
             int left = 0;
             int len = nums.size();
             int res = 1;
             for (int right = 1; right < len; ) {
                 if (nums[right] > nums[right - 1]) {
                     res = max(res, right - left + 1);
                     right++;
                 } else {
                     left = right;
                     right++;
                 }
             }
             return res;
         }
     };
    

718. 最长重复子数组

题目链接:718. 最长重复子数组

  • dp含义:dp[i][j] 以i-1为结尾的nums1, 和以j-1为结尾的nums2 的最长重复子数组的长度

  • 递推公式:

    • if (nums[i] > nums[i - 1]) dp[i] = dp[i-1] + 1
  • 初始化:dp[i][0] = 0; dp[0][j] = 0

  • 结果不是dp[len1][len2],在过程中,因为不一定是以i-1或者j-1为结尾

  • 如果i和j结尾的话需要进行初始化

  •  class Solution {
     public:
         int findLength(vector<int>& nums1, vector<int>& nums2) {
             int len1 = nums1.size();
             int len2 = nums2.size();
             int res = 0;
             // dp[i][j] 以nums[i - 1]和nums2[j - 1]为结尾的最长子数组的长度
             vector<vector<int>> dp(len1 + 1, vector<int>(len2 + 1)); 
             for (int i = 1; i <= len1; i++) {
                 for(int j = 1; j <= len2; j++) {
                     if (nums1[i - 1] == nums2[j - 1]) {
                         dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + 1);
                     } 
                     res = max(dp[i][j], res);
                 }
             }
             return res;
         }
     };