返回

如何用 Python 轻松搞定 LeetCode 122:买卖股票的最佳时机 II

前端

对于想要在股票市场上大展身手的程序员来说,LeetCode 122:买卖股票的最佳时机 II 绝对不容错过。这是一道经典的动态规划问题,考验着你的算法思维和对 Python 的掌控。本文将手把手教你如何用 Python 巧妙地解决这道题,让你在股票交易的竞技场上游刃有余。

理解题目

LeetCode 122 题的乍一看有点复杂,但其实核心思想很简单:它要求你找到一种方法,在给定的价格数组中进行尽可能多的交易,从而获得最大的利润。简单来说,你可以在任何时间点买入或卖出股票,但不能同时持有超过一支股票。

动态规划算法

解决这道题的关键在于动态规划算法。动态规划是一种将问题分解成更小、更简单的子问题的技术,然后逐层解决这些子问题,最终得到问题的整体解。对于本题,我们可以将问题分解为以下子问题:

  • dp[i][0] :在第 i 天持有股票的最大利润
  • dp[i][1] :在第 i 天不持有股票的最大利润

状态转移方程

有了子问题,我们就可以推导出状态转移方程:

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

其中:

  • dp[i-1][0] 表示前一天持有股票的最大利润
  • dp[i-1][1] 表示前一天不持有股票的最大利润
  • prices[i] 表示第 i 天的股票价格

Python 代码

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

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

  return dp[n-1][1]

复杂度分析

  • 时间复杂度:O(n),其中 n 是价格数组的长度。
  • 空间复杂度:O(n)。

优化技巧

为了进一步优化代码,我们可以使用以下技巧:

  • 滚动数组:将动态规划表从二维压缩成一维,从而节省空间。
  • 记录最后一次交易日:这样可以避免在每次迭代中计算 dp[i-1][0]dp[i-1][1]

优化后的 Python 代码

def maxProfit(prices):
  n = len(prices)
  dp_i_0, dp_i_1 = -prices[0], 0

  for i in range(1, n):
    dp_i_0 = max(dp_i_0, dp_i_1 - prices[i])
    dp_i_1 = max(dp_i_1, dp_i_0 + prices[i])

  return dp_i_1

总结

通过这篇文章,我们详细介绍了如何用 Python 解决 LeetCode 122:买卖股票的最佳时机 II。我们从理解题目开始,一步步推导出了动态规划的算法和状态转移方程。然后,我们提供了清晰易懂的 Python 代码,并通过优化技巧进一步提升了效率。现在,你可以自信地运用这套方法解决更多类似的问题,在股票交易的战场上叱咤风云!