【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即可。

posted @ 2021-04-03 16:21  tmpUser  阅读(45)  评论(0编辑  收藏  举报