LeetCode算法题之122. Best Time to Buy and Sell Stock II(easy)【Python3题解】

题目描述:
Say you have an array prices for which the ith element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete as many transactions as you like (i.e., buy one and sell one share of the stock multiple times).

Note: You may not engage in multiple transactions at the same time (i.e., you must sell the stock before you buy again).

Example 1:

Input: [7,1,5,3,6,4]
Output: 7
Explanation: Buy on day 2 (price = 1) and sell on day 3 (price = 5), profit = 5-1 = 4.
Then buy on day 4 (price = 3) and sell on day 5 (price = 6), profit = 6-3 = 3.

Example 2:

Input: [1,2,3,4,5]
Output: 4
Explanation: Buy on day 1 (price = 1) and sell on day 5 (price = 5), profit = 5-1 = 4.
Note that you cannot buy on day 1, buy on day 2 and sell them later, as you are
engaging multiple transactions at the same time. You must sell before buying again.

Example 3:

Input: [7,6,4,3,1]
Output: 0
Explanation: In this case, no transaction is done, i.e. max profit = 0.

Constraints:

1 <= prices.length <= 3 * 10 ^ 4
0 <= prices[i] <= 10 ^ 4

题目大意:

解题思路:

  • 先声明:下面的想法与解法,包括图片,来源于算法界一哥,扛把子,labaladong的GitHub仓库,是东哥总结出来的关于此类题目的一个模板,本人在这里,复述,也是自己整理记忆
  • 上面说到,此类题目,刚开始刷题的朋友可能不知道,关于股票买卖的问题,LeetCode上,共有6道题目,两道简单,两道中等,两道困难
  • 下面上套路,杠杠的
  • 运用动态规划,第一步,dp数组的含义,一定要明确无误,针对这道题来说,一维的dp数组恐怕就有点吃力了,因为在你大致看过这6道题目之后,你应该也就能发现,是有很大共通点的,基本就是涉及到几个变化的地方
  • 第一个,天数,第几天,i,这是变化的,第二个,k,代表着你能交易的最大次数,第三个,就是你手上有股票与否,在这里用0,1,表示
  • dp数组的样子大致长这样:dp[i][k][0],表示第几天,你还剩下k次的交易,此时你手上没有股票
  • 看过上面超链接中的I的朋友就知道,I中,不过就是k=1时的一种特殊情况,在那篇文章中,关于dp[i] 如何由dp[i-1]推出来,之间的递推关系,也做了简单说明,看了,应该能懂一点
  • 下面上东哥的套路模板,上图片
    在这里插入图片描述
  • 大家看到状态转移方程了吗?那个就是LeetCode上面关于股票买卖的所有问题的解题框架,有了它,你就全部搞定
  • 解释如下:dp[i][k][0]表示第i天,你现在还有k次的交易机会,你手上现在没有股票,那么这种状态,你是怎么得来的呢?
  • 是这样的来的,要不就是你前面一天,本来就有股票,然后你今天也不买不卖,歇着,就是max函数式子中的前一部分,后一部分呢,就是你前一天有股票啊,但是你今天把它卖了,你就没有了,然而你的收益,就是加上价格喽,因为题目让求最大利润吗,所以取最大值啊
  • 这样的状态方程,加上前面的base case,就把所有的可能情况,全部穷举出来了,这样一来,通关了
  • 关于本题
  • 因为此时你的k是无穷大,那么状态转移方程中的k与k-1的值,就可以认为相等
  • 状态转移方程就简化了
  • 上图
    在这里插入图片描述
  • 下面我奉上代码的时候,你在和I问题的代码,一比较,我相信你会有新的理解

少废话,上代码:

class Solution:
    def maxProfit(self, prices):
        dp_i_0 = 0
        dp_i_1 = float("-inf")

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

        return dp_i_0

运行时间和内存占用:

  • Runtime: 64 ms, faster than 61.07% of Python3 online submissions for Best Time to Buy and Sell Stock II.
  • Memory Usage: 15.1 MB, less than 7.32% of Python3 online submissions for Best Time to Buy and Sell Stock II.
再说一句
以上来源于labuladong,公众号也好,GitHub也罢,都是这个名字,写出了各种算法题的解题套路,很值得学习一番,看不懂本文的,直接自己去找东哥的,他写的很好
在此致敬
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值