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

题目要求

给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。
注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
在这里插入图片描述

解题要求

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

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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值