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