算法学习打卡计划

leetcode第七百一十四题——买卖股票的最佳时机含手续费

2020-02-21  本文已影响0人  不分享的知识毫无意义

这已经是股票系列的第五题了,股票系列其实是有迹可循的:
(1)思路1:设置买入,卖出两个变量,输出最大的卖出价格,适用于不限制交易次数的情况。
(2)思路2:动态规划,设置第i天第k次交易的最大收益,同时还考虑一个最小价格,适用于限制交易次数的情况。

1.题目

原题:

给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每次交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。

例子:

输入: prices = [1, 3, 2, 8, 4, 9], fee = 2
输出: 8
解释: 能够达到的最大利润:  
在此处买入 prices[0] = 1
在此处卖出 prices[3] = 8
在此处买入 prices[4] = 4
在此处卖出 prices[5] = 9
总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8.

2.解析

2.1 错误思路

先说一个错误的思路,刚开始我沿袭了更新第一百二十二题的做法,想法是无非每次交易加上一个费用,思路是如果当前价格减最小价格和费用之差大于0就交易,同时更新收益和最小价格,反之则更新最小价格,这样思考的错误之处在于没有考虑其实次数也是有限制的,因为你多交易一次多花一次钱。其实这个思路可以做出来,笔者懒得往下思考了。

2.2 正确思路

跟开篇描述一样,设置买入和卖出值,初始买入收益为负,卖出因为不可卖出所以为0,然后先更新sell,再更新buy,最后返回buy值,思路简单,运行快。

3.python代码

class Solution:
    def maxProfit(self, prices, fee):
        if not prices:
            return 0
        buy = -(prices[0] + fee)
        sell = 0
        for i in range(1, len(prices)):
            sell = max(sell, prices[i] + buy)
            buy = max(buy, sell - prices[i] -fee)
            print(sell, buy)
        return sell
上一篇下一篇

猜你喜欢

热点阅读