返回

掌握 LeetCode #121:买卖股票的最佳时机,开启投资成功之路

见解分享

在股票市场中把握先机:LeetCode #121 买卖股票的最佳时机

在股票市场中,把握最佳时机至关重要。LeetCode #121 买卖股票的最佳时机正是磨练您投资技能的绝佳挑战。这道题看似简单,实则暗藏玄机,掌握其精髓将为您开启投资成功之路。

理解问题本质

LeetCode #121 的目标是找到买入和卖出股票的最佳时机,以最大化利润。您将得到一个表示股票每日价格的整数数组。您的任务是计算出您能获得的最大利润。

算法策略

一种高效的解决方法是利用动态规划。我们定义一个数组 dp,其中 dp[i] 表示在前 i 天持有股票的最佳利润。对于每个 i,我们可以考虑两种情况:

  • 持有股票: 如果在前 i-1 天持有股票,则当前利润为 dp[i-1]。
  • 卖出股票: 如果在前 i-1 天未持有股票,则当前利润为价格[i] - 买入价格,其中买入价格是我们之前遇到的最低价格。

因此,dp[i] 的递推关系为:

dp[i] = max(dp[i-1], 价格[i] - min(价格[:i]))

代码实现

func maxProfit(_ prices: [Int]) -> Int {
    if prices.isEmpty {
        return 0
    }

    var minPrice = prices[0]
    var maxProfit = 0

    for price in prices {
        minPrice = min(minPrice, price)
        maxProfit = max(maxProfit, price - minPrice)
    }

    return maxProfit
}

复杂度分析

  • 时间复杂度:O(n),其中 n 为价格数组的长度。
  • 空间复杂度:O(1),因为我们只需要存储当前的最小价格和最大利润。

实例演示

假设我们有一个股票价格数组 [7, 1, 5, 3, 6, 4]

  • 在第一天,我们以 7 美元买入股票。
  • 第二天,我们以 1 美元的价格持有股票。
  • 在第三天,我们以 5 美元的价格卖出股票,利润为 4 美元。
  • 在第四天,我们以 3 美元的价格重新买入股票。
  • 在第五天,我们以 6 美元的价格卖出股票,利润为 3 美元。
  • 在第六天,我们以 4 美元的价格持有股票。

因此,在这六天内,我们可以获得的最大利润为 4 美元 + 3 美元 = 7 美元。

总结

LeetCode #121 买卖股票的最佳时机是一道经典的算法题,测试您的问题解决能力和算法设计技能。通过使用动态规划,我们可以有效地找到最大化利润的买卖时机。掌握这种技巧将为您的投资决策提供宝贵的见解,帮助您在股票市场中取得成功。

常见问题解答

  1. 为什么我们不保存最低价格的历史记录,而是只保存当前的最低价格?
    因为当前的最低价格是我们在之前所有时间段中遇到的最低价格。因此,我们只需要跟踪当前的最低价格。

  2. 这种算法是否可以扩展到手续费的情况?
    是的,我们可以通过在卖出利润中减去手续费来修改算法以适应手续费。

  3. 如果股票价格一直在下跌怎么办?
    在这种情况下,算法将无法获得任何利润。这是因为我们总是买入然后卖出,而卖出的价格总是低于买入的价格。

  4. 这种算法是否可以在实时股票价格上使用?
    是的,这种算法可以应用于实时股票价格,但要注意,股票价格可能会快速波动,这可能会影响算法的准确性。

  5. 除了动态规划,还有什么其他方法可以解决这个问题?
    另一个解决这个问题的方法是贪心算法,它依次考虑每个价格,并决定是否买入或卖出股票。