📌  相关文章
📜  最多两次买卖股票的最大利润(1)

📅  最后修改于: 2023-12-03 15:10:34.631000             🧑  作者: Mango

最多两次买卖股票的最大利润

问题描述

给定一组股票价格,你可以进行最多两次买卖操作,请计算出最大的利润。

示例

输入: [3,3,5,0,0,3,1,4] 输出: 6 解释: 在第 4 天(股票价格 = 0)的时候买入, 在第 6 天(股票价格 = 3)的时候卖出, 再在第 7 天(股票价格 = 1)的时候买入, 在第 8 天(股票价格 = 4)的时候卖出, 总利润 = (3-0) + (4-1) = 6。

解法

让我们考虑用动态规划的方式解决这个问题。需要三个状态来描述这个问题:

  • buy1,第一次买入的最大利润;
  • sell1,第一次卖出的最大利润;
  • buy2,第二次买入的最大利润;
  • sell2,第二次卖出的最大利润;

在每一天结束后,我们用以下方式更新这些变量:

  • 对于第一次购买,只需要我们将当前价格的相反数加入其中,因为我们始终在此价格处将股票买入;
  • 对于第一次卖出,我们将当前价格加入其中后,检查是否有更好的利润(即,购买日期早于当前日);
  • 对于第二次购买,我们将当前利润(即第一次卖出后的利润)减去当前价格后加入其中后,检查是否有更好的利润(即,购买日期早于当前日);
  • 对于第二次卖出,我们将当前利润(即第二次购买后的利润)加到其中后,检查是否有更好的利润。

最终,我们将返回 sell2,因为在最后一天,可以比之更大的利润量只能是再次购买并卖出。

代码实现
def max_profit(prices: List[int]) -> int:
    buy1, sell1 = float('inf'), 0
    buy2, sell2 = float('inf'), 0
    for price in prices:
        buy1 = min(buy1, price)
        sell1 = max(sell1, price - buy1)
        buy2 = min(buy2, price - sell1)
        sell2 = max(sell2, price - buy2)
    return sell2
复杂度分析
  • 时间复杂度:$O(n)$,其中 $n$ 是股票价格序列的长度。
  • 空间复杂度:$O(1)$,不需要额外的空间。