手把手带你用 Python 征服 LeetCode 121:买卖股票的最佳时机
2023-09-14 21:22:17
引言
在股票市场中,投资者时刻关注着股价的涨跌,以寻找最佳的买卖时机,从而实现利润最大化。LeetCode 121:买卖股票的最佳时机正是考察这一场景的经典算法问题。本教程将带你深入剖析此问题,并用 Python 语言提供一个清晰易懂的解决方案。
算法原理
买卖股票的最佳时机算法本质上是一个动态规划问题。它通过维护一个状态表,记录股票交易过程中可能遇到的各种状态和最优解,逐步求解出全局最优解。
状态表中包含两个状态:
- 买入状态 :表示当前已经购买了股票,并持有该股票。
- 卖出状态 :表示当前未持有股票,可以自由地买卖股票。
对于每个状态,我们记录其最优收益值。算法从初始状态开始,逐个处理股票价格,并更新状态表中的最优收益值。最终,状态表中的最大收益值即为问题的解。
Python 代码实现
def max_profit(prices):
"""
:type prices: List[int]
:rtype: int
"""
if not prices:
return 0
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], -prices[i])
# 卖出状态
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i])
# 返回最终最优收益
return dp[-1][1]
代码解读
-
初始化状态表:
dp[i][0]
表示第i
天处于买入状态时的最优收益,dp[i][1]
表示处于卖出状态时的最优收益。 -
逐个处理股票价格:对于第
i
天,我们计算买入和卖出的最优收益,并更新状态表。 -
买入状态:
dp[i][0] = max(dp[i - 1][0], -prices[i])
,表示第i
天处于买入状态,可以从前一天的买入状态或直接在第i
天买入股票中选择最优收益。 -
卖出状态:
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i])
,表示第i
天处于卖出状态,可以从前一天的卖出状态或前一天的买入状态卖出股票中选择最优收益。 -
最终最优收益:状态表最后一个元素
dp[-1][1]
即为问题求解的最终最优收益。
总结
通过清晰的算法原理阐述和简洁易懂的 Python 代码实现,本教程帮助你深入理解了如何解决 LeetCode 121:买卖股票的最佳时机问题。掌握这种动态规划技巧将使你能够解决更多此类算法问题,并在股票投资领域大展身手。