返回

轻松攻克 LeetCode 121:买卖股票的最佳时机

前端

引言

交易股票是一门充满风险和机遇的艺术,想要从中获利需要敏锐的眼光和深厚的分析能力。在 LeetCode 121 题中,你将面临一个经典的股票交易问题:给定一组股票的价格序列,如何找出买卖股票的最佳时机,以获得最大的利润?

算法原理

解决 LeetCode 121 题的关键在于理解动态规划的思想。动态规划是一种自底向上的算法,它将问题分解成一系列子问题,然后逐步解决这些子问题,最终得到整体问题的最优解。

对于 LeetCode 121 题,我们可以定义一个状态转移方程:

dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i])
dp[i][1] = max(dp[i-1][1], -prices[i])

其中:

  • dp[i][0] 表示在第 i 天结束时持有股票的最大利润
  • dp[i][1] 表示在第 i 天结束时不持有股票的最大利润
  • prices[i] 表示第 i 天的股票价格

算法实现

使用动态规划解决 LeetCode 121 题的 Python 实现如下:

def maxProfit(prices):
  dp = [[0] * 2 for _ in range(len(prices) + 1)]

  for i in range(1, len(prices) + 1):
    dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i])
    dp[i][1] = max(dp[i-1][1], -prices[i])

  return dp[-1][0]

时间复杂度

动态规划算法的时间复杂度为 O(n), 其中 n 为股票价格序列的长度。

空间复杂度

动态规划算法的空间复杂度为 O(n), 其中 n 为股票价格序列的长度。

示例

考虑以下股票价格序列:[7, 1, 5, 3, 6, 4]。使用我们的算法,我们可以得到以下动态规划表:

天数 持有股票 不持有股票
1 0 0
2 0 -1
3 4 -1
4 4 -3
5 7 -3
6 7 -4

因此,在第 6 天结束时,持有股票的最大利润为 7 美元。

结论

通过深入解析动态规划思想,我们可以轻松解决 LeetCode 121 题。掌握动态规划技术不仅可以帮助你解决算法难题,更能让你深入理解编程问题的本质。希望这篇博客能为你带来启发,帮助你成为一名更出色的算法工程师。