今日效率低下,努力把题做完。做快一点!!!
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;}elsedp[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;
}
一维有点困难了。
拓展大致能看懂,二维的容易理解一点。