返回
如何用 Python 轻松搞定 LeetCode 122:买卖股票的最佳时机 II
前端
2023-11-26 05:32:12
对于想要在股票市场上大展身手的程序员来说,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 代码,并通过优化技巧进一步提升了效率。现在,你可以自信地运用这套方法解决更多类似的问题,在股票交易的战场上叱咤风云!