
最近看到 LeetCode 官方公众号推送了一条《5 分钟轻松制作力扣题解动画》,用 PPT 做解题的 GIF 动画,感觉很有意思。
老张手痒痒,自己找了一个动态规划的题目《121. 买卖股票的最佳时机》,尝试一下用 GIF 动画讲解解题过程。
先来看题目:
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
注意:你不能在买入股票前卖出股票。
示例 1:
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock
看到这种求最优解的题目,很容易让人想到动态规划。
我们来尝试一下找到状态转移方程。
-
每天的股票价格为 prices[] ,定义数组 dp[] ,其中 dp[i] 表示第 i 天以 prices[i] 卖出股票可以获得的最大利润。
-
可以得到方程:
dp[x] = max(dp[x-1], dp[x] - min(prices[0:x]))
即第 x 天的最大利润,要么是第 x-1 天的最大利润,要么是当天的价格减去历史最低价。
考虑到历史最低价以及最大利润都是区间范围内的极限值,均可以用单个变量来优化时间和空间复杂度。
过程没看懂?是时候展示 PPT 动画了。

解题代码如下:
class Solution:
def maxProfit(self, prices: List[int]) -> int:
if not prices:
return 0
# 历史最高利润
max_profit = 0
# 历史最低股价
min_price = prices[0]
for p in prices[1:]:
if p <= min_price:
min_price = p
else:
max_profit = max(max_profit, p - min_price)
return max_profit
是不是很有意思?
感兴趣的小伙伴可以点击《5 分钟轻松制作力扣题解动画》阅读制作教程。




被折叠的 条评论
为什么被折叠?



