leetcode188. Best Time to Buy and Sell Stock IV(买卖股票的最佳时机 IV)

题目要求

给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。
注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
leetcode188. Best Time to Buy and Sell Stock IV(买卖股票的最佳时机 IV)_第1张图片

解题要求

来了来了!! 常规股票四连的最后一道,首先仔细想想看这四道题的内容有什么区别和联系。

补充 股票四连合集,看了不亏,没看后悔!!:

NO.1 leetcode 121 Best Time to Buy and Sell Stock(买卖股票的最佳时机)
NO.2 leetcode122. Best Time to Buy and Sell Stock II (买卖股票的最佳时机 II)
NO.3 leetcode123. Best Time to Buy and Sell Stock III( 买卖股票的最佳时机 III)
NO.4 leetcode188. Best Time to Buy and Sell Stock IV(买卖股票的最佳时机 IV)

第一道题的要求是,我们只卖买一次;
第二题是无限次数的买卖;
第三题是只能买卖两次;
题是买卖k次。

注意啦!! 那我们在做第四题的时候,是不是就相当于考虑了前面的三种情况?第一题实际是K=1,第二题实际是K=无穷,第三题是K=2.

本题由于 k 的大小可以非常大, 一定要先判断 k 的大小,然后分情况讨论。

如果超过范围 (n/2), 则要转换为无限次的股票买卖, 否则会导致爆栈。无穷次数的话就和第二题是一样的,我们比较前后两次的价格,如果差值为正就加入利润。

如果在可以接受的范围内(小于n/2),那么我们就仿照的第一,三题的样子,通过Kadane’s算法来进行计算,分别比较每次的买入价格和卖出价格。如果符合要求我们就进行更新。直到K次完毕!

难点是:K的大小时影响计算的,所以我们要根据K的大小进行分情况讨论。

主要代码python

class Solution(object):
    def maxProfit(self, k, prices):
        def maxProfitKInf(prices):
            max_profit = 0
            for i in xrange(1, len(prices)):
                if prices[i] > prices[i-1]:
                    max_profit += prices[i] - prices[i-1]
            return max_profit

        if k == 0 or not prices:
            return 0
        
        n = len(prices)

        # k is considered as infinite here
        if k >= n / 2:
            return maxProfitKInf(prices)

       
        buy, sell = [float('inf')] * (k+1), [0] * (k+1)
        for i in xrange(n):
            for j in xrange(1, k+1):
                buy[j] = min(buy[j], prices[i]-sell[j-1])
                sell[j] = max(sell[j], prices[i]-buy[j])
        return sell[k]

原题链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv

你可能感兴趣的:(leetcode题解)