用LeetCode官方推荐的动画解《买卖股票的最佳时机》

最近看到 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

看到这种求最优解的题目,很容易让人想到动态规划。

我们来尝试一下找到状态转移方程。

  1. 每天的股票价格为 prices[] ,定义数组 dp[] ,其中 dp[i] 表示第 i 天以 prices[i] 卖出股票可以获得的最大利润。

  2. 可以得到方程:

          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 分钟轻松制作力扣题解动画》阅读制作教程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值