目录
LeeCode 300.最长递增子序列
LeeCode 674. 最长连续递增序列
LeeCode 718. 最长重复子数组
LeeCode 300.最长递增子序列
动规五部曲:
1.确定dp数组及下标含义: dp[i]: i 之前包括 i 的以 nums[i] 结尾的最长递增子序列的长度;
2.确定递推公式:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);
3.dp数组如何初始化:dp[i] = 1;
4.确定遍历顺序:从前到后遍历;
5.举例递推dp数组;
代码:
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if (nums.size() <= 1) return nums.size();
vector<int> dp(nums.size(), 1);
int result = 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);
}
if (dp[i] > result) result = dp[i];
}
return result;
}
};
时间复杂度:O(n²) 空间复杂度:O(n)
LeeCode 674. 最长连续递增序列
动规五部曲:
1.确定dp数组及下标含义: dp[i]:以下标 i 结尾的连续递增子序列的长度;
2.确定递推公式:dp[i] =dp[i - 1] + 1;
3.dp数组如何初始化:dp[i] = 1;
4.确定遍历顺序:从前到后遍历;
5.举例递推dp数组;
代码:
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
if (nums.size() == 0) return 0;
int result = 1;
vector<int> dp(nums.size(), 1);
for (int i = 1; i < nums.size(); i++) {
if (nums[i] > nums[i - 1]) dp[i] = dp[i - 1] + 1;
if (dp[i] > result) result = dp[i];
}
return result;
}
};
时间复杂度:O(n) 空间复杂度:O(n)
LeeCode 718. 最长重复子数组
动规五部曲:
1.确定dp数组及下标含义: dp[i][j]:以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组的长度;
2.确定递推公式:if(A[i - 1] == B[i - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
3.dp数组如何初始化:dp[i][0] = 0, dp[0][j] = 0;
4.确定遍历顺序:外层for循环遍历A,内层for循环遍历B;
5.举例递推dp数组;
代码:
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
vector<vector<int>> dp(nums1.size() + 1, vector<int>(nums2.size() + 1, 0));
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;
if (dp[i][j] > result) result = dp[i][j];
}
}
return result;
}
};
时间复杂度:O(n x m) (n 为A长度,m为B长度) 空间复杂度:O(n x m)