美文网首页算法学习打卡计划
leetcode第七百一十四题——买卖股票的最佳时机含手续费

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

作者: 不分享的知识毫无意义 | 来源:发表于2020-02-21 14:38 被阅读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
    

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/iqucqhtx.html