300.最长递增子序列
今天开始正式子序列系列,本题是比较简单的,感受感受一下子序列题目的思路。
视频讲解:动态规划之子序列问题,元素不连续!| LeetCode:300.最长递增子序列_哔哩哔哩_bilibili
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if (nums.size()==1)return 1;
vector<int>dp(nums.size(),1);
int res=0;
for (int i=1;i<nums.size();i++){
for (int j=0;j<i;j++){
if (nums[j]<nums[i])dp[i]=max(dp[j]+1,dp[i]);
}
res=max(dp[i],res);
}
return res;
}
};
674. 最长连续递增序列
本题相对于昨天的动态规划:300.最长递增子序列 最大的区别在于“连续”。 先尝试自己做做,感受一下区别
视频讲解:动态规划之子序列问题,重点在于连续!| LeetCode:674.最长连续递增序列_哔哩哔哩_bilibili
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
if (nums.size()==1)return 1;
vector<int>dp(nums.size(),1);
int res=0;
for (int i=1;i<nums.size();i++){
if (nums[i]>nums[i-1])dp[i]=dp[i-1]+1;
res=max(res,dp[i]);
}
return res;
}
};
718. 最长重复子数组
稍有难度,要使用二维dp数组了
视频讲解:动态规划之子序列问题,想清楚DP数组的定义 | LeetCode:718.最长重复子数组_哔哩哔哩_bilibili
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 res=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;
res=max(dp[i][j],res);
}
}
return res;
}
};