返回

深挖 LeetCode 121 题:掌握买股票的最佳时机

前端

在算法和数据结构的浩瀚世界中,LeetCode 121 题——《买股票的最佳时机》就像一颗闪亮的明珠。这是一道经典的动态规划问题,要求我们找出在特定时间范围内买卖股票以获得最大利润的最佳时机。让我们踏上这段算法之旅,用清晰易懂的语言和引人入胜的示例,揭开这道题目的奥秘。

问题概述

我们有一个数组 prices,其中每个元素 prices[i] 代表第 i 天某只股票的价格。我们的目标是找到买入和卖出股票的最佳时机,以实现利润最大化。然而,我们只能买入一次,卖出一次。

动态规划的优雅

为了解决这个问题,我们引入了一种强大的算法技术——动态规划。动态规划的核心思想是将问题分解成更小的子问题,然后逐步解决这些子问题,最终得到整体问题的解决方案。

在 LeetCode 121 题中,我们定义了一个动态规划表 dp,其中 dp[i] 表示在第 i 天结束时,我们持有的最大利润。显然,dp[0] 初始化为 0,因为我们在第 0 天没有股票。

然后,对于第 i 天(从 1 到 prices.length - 1),我们考虑两种情况:

  1. 持有股票: 如果我们在第 i - 1 天持有股票,那么在第 i 天结束时,我们的利润将是 dp[i - 1]。
  2. 买入股票: 如果我们在第 i 天买入股票,那么我们的利润将是 prices[i] 减去买入股票的成本(即 prices[i - 1])。

我们取这两种情况的最大值作为 dp[i] 的值,因为我们希望在每一天结束时最大化利润。

代码实现(Python)

def maxProfit(prices):
    if not prices or len(prices) == 0:
        return 0
    
    dp = [0] * len(prices)
    for i in range(1, len(prices)):
        dp[i] = max(dp[i - 1], prices[i] - prices[i - 1])
    
    return max(dp)

复杂度分析

  • 时间复杂度:O(n),其中 n 是价格数组的长度。
  • 空间复杂度:O(n),因为我们使用了一个动态规划表 dp 来存储子问题的解决方案。

总结

LeetCode 121 题《买股票的最佳时机》是一个出色的动态规划问题,展示了这种算法技术在解决复杂问题中的强大能力。通过将问题分解成更小的子问题,并逐步求解这些子问题,我们能够有效地找出买入和卖出股票的最佳时机,以最大化利润。

掌握动态规划对于算法工程师至关重要,因为它在许多实际问题中都有应用,例如优化、路径规划和机器学习。因此,深入理解 LeetCode 121 题不仅能拓宽你的算法知识,还能为你的职业生涯奠定坚实的基础。