1143.最长公共子序列
解题思路
这题一开始想用滚动数组的办法做,后来发现并不行,因为要去的是连续,并且可以跳元素,但是总体顺序不能变,因此需要从前往后遍历,这就不满足滚动数组需要的倒序遍历了。和连续情况不一样的是,即使当前的元素不相等,也要找到前面符合要求的最长子序列,保证后续结果正确。
解法
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
int n1 = text1.size();
int n2 = text2.size();
int result = 0;
if(n1==0 || n2==0)
return result;
vector<vector<int>> dp(n1+1, vector<int>(n2+1, 0));
for(int i=1; i<=n1; i++){
for(int j=1; j<=n2; j++){
if(text1[i-1]==text2[j-1])
dp[i][j] = dp[i-1][j-1]+1;
else
dp[i][j] = max(dp[i][j-1], dp[i-1][j]);
if(result < dp[i][j])
result = dp[i][j];
}
}
return result;
}
};
- 时间复杂度: O ( m n ) O(mn) O(mn)
- 空间复杂度: O ( m n ) O(mn) O(mn)
1035.不相交的线
解题思路
为了使得线条不重叠,就需要两数组的配对组合相对顺序相同,本质上和上一题的做法相同。
解法
class Solution {
public:
int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
int n1 = nums1.size();
int n2 = nums2.size();
int result = 0;
vector<vector<int>> dp(n1+1, vector<int>(n2+1, 0));
for(int i=1; i<=n1; i++){
for(int j=1; j<=n2; j++){
if(nums1[i-1]==nums2[j-1]){
dp[i][j] = dp[i-1][j-1] + 1;
} else {
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
}
return dp[n1][n2];
}
};
- 时间复杂度: O ( m n ) O(mn) O(mn)
- 空间复杂度: O ( m n ) O(mn) O(mn)
53. 最大子序和
解题思路
贪心的时候顺带练习了。回归最直接的动态规划思路,遇到大的就更新。
解法
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n = nums.size();
if(n==1) return nums[0];
vector<int> dp(n);
dp[0] = nums[0];
int result = nums[0];
for(int i=1; i<n; i++){
dp[i] = max(dp[i-1]+nums[i], nums[i]);
if(result < dp[i])
result = dp[i];
}
return result;
}
};
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
392.判断子序列
解题思路
和最长公共子序列的思路类似,元素不相等的情况的赋值取决于哪个数组是可以删除元素的。
解法
class Solution {
public:
bool isSubsequence(string s, string t) {
int n1 = s.size();
int n2 = t.size();
if(n1 > n2) return false;
int result = 0;
vector<vector<int>> dp(n1+1, vector<int>(n2+1, 0));
for(int i=1; i<=n1; i++){
for(int j=1; j<=n2; j++){
if(s[i-1]==t[j-1])
dp[i][j] = dp[i-1][j-1] + 1;
else
dp[i][j] = dp[i][j-1]; // 取决于哪个可以删除元素
if(result < dp[i][j])
result = dp[i][j];
}
}
return result == n1;
}
};
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
今日总结
国庆在忙答辩,补卡中()

1216

被折叠的 条评论
为什么被折叠?



