返回

深入解析 LeetCode 第 123 题:买卖股票的最佳时机 III

后端

在最多进行两次交易的情况下,如何实现股票交易的最大利润?

当谈到股票交易时,每个人都希望以最小的投资获得最大的回报。在莱特科德的第 123 题中,我们面临的挑战是在最多进行两次交易的情况下,实现股票交易的最大利润。在这篇博客中,我们将深入探讨这个问题,找出最优解决方案,并提供一个详细的实现指南。

问题分解

要解决这个问题,我们首先需要了解其约束条件。我们最多只能进行两次交易,这意味着我们可以进行以下两种类型的操作:

  • 一次购买和一次出售
  • 两次购买和两次出售

最优解决方案

为了制定最优解决方案,我们需要分析股票价格的变化趋势。假设我们有一个股票价格序列 [p0, p1, ..., pn-1],其中 pi 表示第 i 天的股票价格。

一次购买和一次出售

对于一次购买和一次出售的策略,我们的目标是找出买入和卖出的最佳时机,以最大化利润。为此,我们可以计算第 i 天之前的所有最小价格 min_price 和第 i 天之后的所有最大价格 max_price。然后,对于每一天 i,我们计算买入当天股票的价格与 max_price 之间的差值。最大差值即为一次购买和一次出售的最佳利润。

两次购买和两次出售

对于两次购买和两次出售的策略,我们需要将问题分解为两个子问题:

  1. 找出第一次买入和卖出的最佳时机,获得第一次交易的利润。
  2. 找出第一次卖出后第二次买入和卖出的最佳时机,获得第二次交易的利润。

最终,我们返回两次交易的利润之和,即为两次购买和两次出售的最大利润。

实现指南

现在,我们有了最优解决方案,让我们用 Python 实现它:

def max_profit(prices):
    """
    计算股票交易的最大利润(最多两次交易)

    Args:
        prices (list): 股票价格列表

    Returns:
        int: 最大利润
    """

    # 初始化一次购买和一次出售的变量
    min_price = float('inf')
    max_profit = 0

    # 遍历价格列表,计算一次购买和一次出售的利润
    for price in prices:
        min_price = min(min_price, price)
        max_profit = max(max_profit, price - min_price)

    # 初始化两次购买和两次出售的变量
    first_buy_price = float('inf')
    first_sell_profit = 0
    second_buy_price = float('inf')
    second_sell_profit = 0

    # 遍历价格列表,计算两次购买和两次出售的利润
    for price in prices:
        first_buy_price = min(first_buy_price, price)
        first_sell_profit = max(first_sell_profit, price - first_buy_price)

        if price < second_buy_price:
            second_buy_price = price
            second_sell_profit = max(second_sell_profit, price - second_buy_price)

    # 返回两次交易的利润之和
    return max(max_profit, first_sell_profit + second_sell_profit)

结论

莱特科德第 123 题要求我们在最多进行两次交易的情况下,实现股票交易的最大利润。通过分析问题并提出最优解决方案,我们提供了详细的实现指南,帮助你理解并解决此问题。

常见问题解答

  1. 为什么我们不考虑进行更多次交易?
    这个问题的目的是在最多两次交易的限制下找到最佳解决方案。

  2. 是否存在获得最大利润的确定性方法?
    不幸的是,没有一种确定性的方法来预测股票价格的未来走势。然而,通过分析历史数据和使用技术指标,我们可以提高预测准确性的几率。

  3. 我可以在不同股票上进行两次交易吗?
    这个问题的目的是在你持有的单只股票上进行两次交易。

  4. 我可以持有一只股票的时间长度有限制吗?
    这个问题没有对持股时间长度进行限制。

  5. 为什么代码使用 float('inf') 初始化 min_pricefirst_buy_price
    float('inf') 代表正无穷大,它用于初始化最低价格,因为我们希望找到股票价格序列中的最低点。