代码随想录算法训练营第四十九天|123. 买卖股票的最佳时机III 、188. 买卖股票的最佳时机 IV

LeetCode 123. 买卖股票的最佳时机 III
题目链接:123. 买卖股票的最佳时机 III - 力扣(LeetCode)代码随想录算法训练营第四十九天|123. 买卖股票的最佳时机III 、188. 买卖股票的最佳时机 IV_第1张图片

这个道题和121. 买卖股票的最佳时机 I、122. 买卖股票的最佳时机 II很像,是两题的结合。

我们就定义两个数组来实现。

代码:

#python  #DP
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        n = len(prices)
        buy1 = buy2 = - prices[0]   //卖两次,从定义出发,定义两个阶段的买和卖
        sell1 = sell2 = 0
        for i in range(1, n):
            buy1 = max(buy1, - prices[i])
            sell1 = max(sell1, buy1 + prices[i])
            buy2 = max(buy2, sell1 - prices[i])   //仔细体会上一题的这个位置
            sell2 = max(sell2, buy2 + prices[i])
        return sell2

LeetCode 188. 买股票的最佳时机IV
题目链接:188. 买卖股票的最佳时机 IV - 力扣(LeetCode)代码随想录算法训练营第四十九天|123. 买卖股票的最佳时机III 、188. 买卖股票的最佳时机 IV_第2张图片

这又是上一题的一个进阶版,其实我们上一题考虑了两个,这次直接来一个DP数组就OK。

代码:

#python
class Solution:
    def maxProfit(self, k: int, prices: List[int]) -> int:
        n = len(prices)
        buy = [-float('inf')] * (k + 1)
        sell = [0] * (k + 1)   #SELL数组
        for price in prices:
            for i in range(1, k + 1):
                buy[i] = max(buy[i], sell[i - 1] - price)
                sell[i] = max(sell[i], buy[i] + price)
        return sell[k]

你可能感兴趣的:(算法)