Best Time to Buy and Sell Stock IV

update Aug 4,2017 9:54

LeetCodearrow-up-right

Say you have an array for which the ith element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete at most k transactions.

Note: You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

Basic Idea:

延续前面的 I, II and III,这里把 III 的要求从最多允许 2 次交易推广到了最多允许 k 次交易,仅仅分两段考虑就很难满足需求了,于是我们需要在状态方程中增加一个维度 j,表示当前操作之前已经有最多 j 次完整交易。如下图:

还需要注意 base case,当天数 i=0 的时候,sell的获利一定是0,buy的一定是 -prices[0]。当之前最大交易次数 j=0 时,sell 的最大收益一定也是 0,因为 j=0 说明到 i 天为止未进行过完整交易,也就没有 买->卖 的过程。之后的情况只要按照状态转移方程递推就可以了。

这个方法时间复杂度和空间复杂度都是 O(k*n). 注意到 计算buy只需要同样 j 的sell,计算sell只要前一天的buy,所以我们可以把空间优化到 O(n)。

另外还有一种情况,因为每次完整交易都需要至少两天,所以如果 k > n/2,那么我们就可以随意交易,问题就退化为 问题II 了。

Python Code:

Java Code (O(n) 空间):

update Sep 20, 2020

有一点需要注意的,就是对于持股状态(buy),已有0次交易时是有意义的,而且此时的value应该是min{cost[i] for i};而对于不持股状态,已有0次交易的value应该都是0。

Java Code

如果需要优化空间从 O(kn) 到 O(n), 有一个简单的方法,就是将数组定义为 int[k][2], 然后根据天数的奇偶性来交替使用两行数组。

Java Code O(n) space

Last updated