714. 买卖股票的最佳时机含手续费
思路
说明: 本篇题解不是自己想出来的,出自:
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/solution/jian-dan-dpmiao-dong-gu-piao-mai-mai-by-tejdo/
用动态规划来做,建立一个数组dp,数组长度为2,第一个元素代表第i天不持有股票,第二个元素代表第i天持有股票
第i天持有股票可以分2种情况,第i-1天不持有股票和第i-1天持有股票:
也就是第i天继续不买股票和第i天卖出股票
dp[0] = max(dp[0], dp[1]+prices[i]-fee)
第i天持有股票也可以分2种情况: 第i-1天不持有股票和第i-1天持有股票
dp[1] = max(dp[0]-prices[i], dp[1])
最后只要股票出掉,那么就是最大收益即dp[0]
class Solution:
def maxProfit(self, prices: List[int], fee: int) -> int:
if len(prices) == 0:
return 0
# 第1天不买收益0元 买 收益-prices[0]
dp = [0, -prices[0]]
# 从第二天开始
for p in range(1, len(prices)):
# 将dp[0]存储起来,因为dp[0]即将变化
tmp = dp[0] # 不买
# 此时计算新的dp[0] 如果前一天不持有今天继续不持有,则收益与前一天一致
# 如果前一天持有今天不持有,就是昨天的收益dp[1]+prices[p]-fee
dp[0] = max(dp[0], dp[1]+prices[p]-fee)
# 今天继续持有,保持不变,昨天没持有今天持有等于买入操作
# 用之前的dp[0]-prices[p] 取最大者
dp[1] = max(dp[1], tmp-prices[p])
# 最后手里不持有股票是最佳收益
return dp[0]