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

📅  最后修改于: 2023-12-03 14:55:17.827000             🧑  作者: Mango

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

题目描述

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

输入: [3,3,5,0,0,3,1,4] 输出: 6 解释: 在第 4 天(股票价格 = 0)的时候买入, 在第 6 天(股票价格 = 3)的时候卖出, 这笔交易所能获得利润 = 3-0 = 3 。

随后,在第 7 天(股票价格 = 1)的时候买入, 在第 8 天 (股票价格 = 4)的时候卖出, 这笔交易所能获得利润 = 4-1 = 3 。

解法一:动态规划
思路

我们可以用一个 4 位的数组来表示在不同的状态下持有股票和累计利润的情况。

我们用 buy1 表示第一次买入的最大利润,用 sell1 表示第一次卖出的最大利润,用 buy2 表示第二次买入的最大利润,用 sell2 表示第二次卖出的最大利润。

对于每个证券价格,我们有四个选择:买入第一个股票,当前收益为负;将第一个股票卖出,当前收益为当前价格加上第一个交易中的收益;第二次买入证券,当前收益为第一个交易的收益减去当前价格;第二次卖出股票,当前收益为当前价格加上第二个交易中的收益。我们将每个操作之后的最大收益存储在相应的变量中,最终 sell2 就是最大交易利润。

代码

Python 代码片段:

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        buy1 = buy2 = float('inf')
        sell1 = sell2 = 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)。只需要常数个变量来存储状态。
总结

本题可以用动态规划的思路进行解答,记录每个状态下的最大利润。本题思路比较巧妙,需要不少思维,同时也需要掌握动态规划的基础概念。