Leetcode 300. 最长递增子序列
题目链接 300 最长递增子序列
常规思路吧,注意一下dp数组的含义 dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度,下面直接上代码:
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if(nums.size() <= 1){
return nums.size();
}
int result = 0;
vector<int>dp(nums.size(),1);
for(int i=1;i<nums.size();i++){
for(int j=0;j<i;j++){
if(nums[i]>nums[j]){
dp[i] = max(dp[j]+1,dp[i]);
}
}
if(result<dp[i]){
result = dp[i];
}
}
return result;
}
};
Leetcode 674. 最长连续递增序列
题目链接 674 最长连续递增序列
贪心和dp都可以,题目比较简单,只需查找nums[i]>nums[i-1]的情况即可,取最大的情况。
下面上代码;
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
dp[i] = dp[i-1]+1;
}
if(dp[i]>result){
result = dp[i];
}
}
return result;
}
};
Leetcode 718. 最长重复子数组
题目链接 718 最长重复子数组
对比两个字符串,相同字母就开始计数,每一个dp数组都要记录,最好取最大的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 reuslt = 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;//这里从零开始是因为我们将其赋成零了,0就不计数了
}
if(reuslt<dp[i][j]){
reuslt = dp[i][j];
}
}
}
return reuslt;
}
};
补