【LeetCode-123】买卖股票的最佳时机 III
问题
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例
输入: prices = [3,3,5,0,0,3,1,4]
输出: 6
解答1:完整状态机
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size(), k = 2;
vector<vector<int>> hold(n + 1, vector<int>(k + 1, INT_MIN));
vector<vector<int>> sold(n + 1, vector<int>(k + 1, 0));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= k; j++) {
sold[i][j] = max(sold[i - 1][j], hold[i - 1][j] + prices[i - 1]);
hold[i][j] = max(hold[i - 1][j], sold[i - 1][j - 1] - prices[i - 1]);
}
}
return sold[n][k];
}
};
解答2:状态压缩
class Solution {
public:
int maxProfit(vector<int>& prices) {
int k = 2;
vector<int> hold(k + 1, INT_MIN);
vector<int> sold(k + 1, 0);
for (int p : prices) {
for (int i = 1; i <= k; i++) {
sold[i] = max(sold[i], hold[i] + p);
hold[i] = max(hold[i], sold[i - 1] - p);
}
}
return sold[k];
}
};
重点思路
分析思路同【LeetCode-188】买卖股票的最佳时机 IV,本题只需要把k
替换为2即可。