714. 买卖股票的最佳时机含手续费

每日一题20201217(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]

每日一题20201217(714. 买卖股票的最佳时机含手续费)

相关文章: