188. 买卖股票的最佳时机IV
分析
-
无交易限制的情况:
- 当
k >= n / 2
(即可以无限次交易的情况),那么我们可以通过每次只要当前价格比前一天高就进行交易,获取利润 - 这种情况下,我们只需要遍历数组,当
prices[i] < prices[i + 1]
时,进行买卖,利润就会累加
- 当
-
有交易次数限制的情况:
- 当
k < n / 2
时,我们需要考虑最多进行k
次交易的情况。为此,我们需要使用动态规划来计算不同交易次数的最大利润 - 使用动态规划状态
f[i][j]
表示前i
天内进行j
次交易的最大利润。我们还可以使用辅助数组g[i][j]
来记录前i
天内进行j-1
次交易,买入股票时的状态(即股票买入价格的最优状态) - 每次更新
f[i][j]
和g[i][j]
时,考虑的是:- 卖出:通过
g[i-1][j] + prices[i-1]
来记录前i-1
天完成j
次交易的最大利润加上当前价格(即卖出) - 买入:通过
f[i-1][j-1] - prices[i-1]
来记录前i-1
天完成j-1
次交易的最大利润减去当前价格(即买入)
- 卖出:通过
- 当
-
状态转移方程
f[i][j] = max(f[i-1][j], g[i-1][j] + prices[i-1])
:卖出时,选择前i-1
天进行j
次交易的最大利润,再加上今天卖出的利润g[i][j] = max(g[i-1][j], f[i-1][j-1] - prices[i-1])
:买入时,选择前i-1
天进行j-1
次交易的最大利润,再减去今天买入的价格
时间复杂度
时间复杂度 O(k * n)
空间复杂度
空间复杂度为 O(k * n)
C++代码
|
|