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

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

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

问题描述

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

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成最多两次交易(一次买入和一次卖出称为一次交易),但是你不能同时参与多个交易(即,你必须在再次购买之前出售掉之前的股票)。

解题思路

这题是121.买卖股票的最佳时机123.买卖股票的最佳时机 III的结合体,我们可以使用类似121.买卖股票的最佳时机的思路来处理每一天的情况。

由于最多只能进行两次交易,我们可以使用两个数组buysell来分别记录第一次和第二次交易的最大利润。对于第一次交易,我们从左向右遍历数组,更新buy[i]表示前i天进行一次交易所能获得的最大收益,即:在前i天中的最低股票价格上买进加上在i天卖出的收益,或者是不进行交易的最大收益。

同理,对于第二次交易,我们从右向左遍历数组,更新sell[i]表示从第i天开始到最后一天进行一次交易所能获得的最大收益,即:在第i天以及之后的最高股票价格上卖出加上之前在i天或之后的交易所得的最大收益,或者是不进行交易的最大收益。

最后,我们遍历一遍数组,计算第一次和第二次交易的最大收益之和,返回该值即可。

代码实现

以下是Python的实现代码:

from typing import List

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        n = len(prices)

        if n < 2:
            return 0

        buy = [0] * n
        sell = [0] * n

        # 前i天进行一次交易所能获得的最大收益
        buy_min_price = prices[0]
        for i in range(1, n):
            buy[i] = max(buy[i-1], prices[i] - buy_min_price)
            buy_min_price = min(buy_min_price, prices[i])

        # 从第i天开始到最后一天进行一次交易所能获得的最大收益
        sell_max_price = prices[-1]
        for i in range(n-2, -1, -1):
            sell[i] = max(sell[i+1], sell_max_price - prices[i])
            sell_max_price = max(sell_max_price, prices[i])

        # 计算最大收益之和
        max_profit = 0
        for i in range(n):
            max_profit = max(max_profit, buy[i] + sell[i])

        return max_profit

以上代码时间复杂度为O(n),空间复杂度为O(n)。