今日效率低下,努力把题做完。做快一点!!!
300.最长递增子序列
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if (nums.size() == 1) return 1;
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;
}
};
其实是两个for循环的问题,没考虑两个for循环,只想到了+1
674. 最长连续递增序列
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
if(nums.size() == 1)return 1;
vector<int>dp(nums.size(),1);
int result = 0;
for(int i = 1;i < nums.size();i++){
if(nums[i] > nums[i-1])dp[i] = max(dp[i],dp[i-1] + 1);
if(dp[i] > result)result = dp[i];
}
return result;
}
};
第一题做出来后,这题就比较好想了。
718. 最长重复子数组
思路有一丝丝的不太对,ij放for外面的写法有问题。
二维的写法基本可以理解:
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
int n = nums1.size();
int m = nums2.size();
if(n == 0 || m == 0)return 0;
vector<vector<int>>dp(n+1,vector(m+1,0));
int result = 0;
for(int i = 1; i <= n;i++){
for(int j = 1;j <= m;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;
}
};
一维的情况需要研究一下:
一维的通过研究输出内容,大致了解,这个倒序很关键,要学习。有点想不出来。
#include <iostream>
#include <vector>
using namespace ::std;
class Solution
{
public:
int findLength(vector<int> &A, vector<int> &B)
{
vector<int> dp(vector<int>(B.size() + 1, 0));
int result = 0;
for (int i = 1; i <= A.size(); i++)
{
cout << "i = " << i << endl;
for (int j = B.size(); j > 0; j--)
{
if (A[i - 1] == B[j - 1])
{
dp[j] = dp[j - 1] + 1;
}
else
dp[j] = 0; // 注意这里不相等的时候要有赋0的操作
if (dp[j] > result)
result = dp[j];
for (int i = 0; i <= 5; i++)
{
cout << dp[i] << ' ';
}
cout << endl;
}
}
cout << result;
return result;
}
};
int main()
{
Solution syz;
vector<int> A(5, 0);
vector<int> B(5, 0);
int AA[5] = {1, 2, 3, 2, 1};
int BB[5] = {3, 2, 1, 4, 7};
for (int i = 0; i < 5; i++)
{
A[i] = AA[i];
B[i] = BB[i];
}
syz.findLength(A, B);
return 0;
}
一维有点困难了。
拓展大致能看懂,二维的容易理解一点。