代码随想录算法训练营第五十二天 |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; } };