版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_36811967/article/details/86477530
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv/
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。
注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: [2,4,1], k = 2
输出: 2
解释: 在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。
示例 2:
输入: [3,2,6,5,0,3], k = 2
输出: 7
解释: 在第 2 天 (股票价格 = 2) 的时候买入,在第 3 天 (股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2 = 4 。
随后,在第 5 天 (股票价格 = 0) 的时候买入,在第 6 天 (股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3 。
这一题是III的衍生版,可以用类似的方法做。注意当交易天数小于等于交易次数的2倍加1时,就可以将问题退化成II,买卖次数随意;否则就用III中的第一种方法类似求解即可:
class Solution:
def maxProfit(self, k, prices):
"""
:type k: int
:type prices: List[int]
:rtype: int
"""
if len(prices) <= 1 or k <= 0:
return 0
max_profit = 0
if len(prices) <= 2*k + 1: # 求所有利润
for i in range(1, len(prices)):
if prices[i]-prices[i-1] > 0:
max_profit += prices[i]-prices[i-1]
return max_profit
buy, sell = [-2**31]*k, [0]*k
for price in prices:
for i in range(k):
buy[i] = max(buy[i], -price) if i == 0 else max(buy[i], sell[i-1]-price)
sell[i] = max(sell[i], price+buy[i])
return sell[-1]