leetcode 困难 —— 买卖股票的最佳时机 III(简单逻辑)

题目:
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

题解:
因为我们要考虑 两笔交易 的最大利润
先考虑两笔交易的关系,不能同时交易,所以相当于没有两笔交易没有 交叉

然后就简单了,把整个分成两段,总共 n 天,分成 1 ~ i 天 和 i + 1 ~ n 天
考虑两个部分,各自的最大利润之和,就是总的利润

1 ~ i 天 最大的利润,不就是 1 ~ i - 1 的最大利润,或第 i 天售出时最大利润
i + 1 ~ n 天最大的利润,不就是 i + 2 ~ n 的最大利润,或第 i + 1 天买入时最大利润
这样做个预处理就行

代码如下:

class Solution {
    
    
public:
    int flag1[100005];
    int flag2[100005];
    int maxProfit(vector<int>& prices) {
    
    
        int f1 = prices[0];
        flag1[0] = 0;
        for(int i = 1; i < prices.size(); i++) {
    
    
            flag1[i] = max(flag1[i - 1], prices[i] - f1);
            f1 = min(f1, prices[i]);
        }
        int f2 = prices[prices.size() - 1];
        flag2[prices.size() - 1] = 0;
        for(int i = prices.size() - 1; i >= 0; i--) {
    
    
            flag2[i] = max(flag2[i + 1], f2 - prices[i]);
            f2 = max(f2, prices[i]);
        }
        int res = max(flag1[prices.size() - 1], flag2[0]);
        for(int i = 1; i < prices.size() - 1; i++) {
    
    
            res = max(res, flag1[i] + flag2[i + 1]);
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/m0_52212261/article/details/129765981
今日推荐