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

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

LeetCode 300.最长递增子序列

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

思路:
选取最长子序列,并收集

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int n = nums.size();
        vector<int> dp(n, 1);
        dp[0] = 1;
        int result = 1;
        for(int i=1; i<n; i++){
            for(int j=0; j<i; j++){
                if(nums[i]>nums[j]) dp[i] = max(dp[i], dp[j]+1);  
            }
            result = max(result, dp[i]);
            
        }
        return result;
    }
};

注意 :

  1. 用max收集最长子序列

LeetCode 674. 最长连续递增序列

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

思路:
记录最大即可

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
        int n = nums.size();
        vector<int> dp(n,1);
        int result = 1;
        for(int i = 1; i < n; i++){
            for(int j=1; j<=i; j++){
                if(nums[j]>nums[j-1]) dp[j] = dp[j-1]+1;
                result = max(result, dp[j]);
            }
        }
        return result;
    }
};

注意 :
1.
2.
3.
4.

LeetCode 718. 最长重复子数组

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

思路:
dp[i][j]的定义是i-1,j-1的最长重复子数组

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        vector<vector<int>> dp(nums1.size()+1, vector<int>(nums2.size()+1));
        int result = 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;
                result = max(dp[i][j], result);
            }
        }
        return result;
    }
};

注意 :

  1. 判断条件为i-1和j-1

你可能感兴趣的:(算法)