之前收藏了极客时间的算法训练营3期 共21课,计划每一课写博客来记录学习,主要形式为
方法类型1
题1
题解
题2
题解
方法类型2
题1
题解
……
题目大体来自leetcode 和 acwing
主要记录和理解代码,所以基本完全搬运了视频题解代码,
个人学习感受体现在大致思路的总结和注释上。
第一题
最长子序列的状态转移
字母相等,是i - 1,j - 1 位置上的长加1
不相等,是之前两个位置其中一个。
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
int m = text1.size();
int n = text2.size();
text1 = " " + text1;
text2 = " " + text2;
vector<vector<int>> f(m + 1, vector<int>(n + 1));
f[0][0] = 0;
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++) {
if (text1[i] == text2[j])
f[i][j] = f[i - 1][j - 1] + 1;
else
f[i][j] = max(f[i - 1][j], f[i][j - 1]);
}
return f[m][n];
}
};
第二题
每一个位置寻找之前所有位置,进行比较。
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int n = nums.size();
vector<int> f(n);
for (int i = 0; i < n; i++) f[i] = 1;
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++){
if (nums[i] > nums[j]){
f[i] = max(f[i], f[j] + 1);
}
}
}
int ans = 0;
for (int i = 0; i < n; i++)
ans = max(ans, f[i]);
return ans;
}
};
第三题
乘积有正有负,最大值最小值对计算都有帮助
class Solution {
public:
int maxProduct(vector<int>& nums) {
int n = nums.size();
vector<int> fMax(n);
vector<int> fMin(n);
fMax[0] = nums[0];
fMin[0] = nums[0];
for (int i = 1; i < n; i++) {
fMax[i] = max(max(nums[i], fMax[i - 1] * nums[i]), fMin[i - 1] * nums[i]);
fMin[i] = min(fMax[i - 1] * nums[i], min(nums[i], fMin[i - 1] * nums[i]));
}
int ans = fMax[0];
for (int i = 1; i < n; i++) {
ans = max(ans, fMax[i]);
}
return ans;
}
};