最佳时机 IV"/>
LeedCode 188. 买卖股票的最佳时机 IV
一、题目
给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入:k = 2, prices = [2,4,1]
输出:2
解释:在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。示例 2:输入:k = 2, prices = [3,2,6,5,0,3]
输出:7
解释:在第 2 天 (股票价格 = 2) 的时候买入,在第 3 天 (股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2 = 4 。随后,在第 5 天 (股票价格 = 0) 的时候买入,在第 6 天 (股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3 。提示:0 <= k <= 1000 <= prices.length <= 10000 <= prices[i] <= 1000
二、思路
- 借用 买卖股票的最佳时机 III的思路,这里交易次数变为k,那么只需要创建一个 [ k ] [ 2 ] [k][2] [k][2]的数组来表示买入k次,卖出k次的状态即可,最后转移与买卖股票的最佳时机 III一致。 算法时间复杂度 O ( n k ) O(nk) O(nk) 空间复杂度 O ( k ) O(k) O(k)
三、代码
class Solution {
public:int maxProfit(int k, vector<int>& prices) {int n = prices.size();if (n == 0 || k == 0) return 0;k = min(k, n / 2); //最多购买卖出次数//vector<vector<int>> dp(k + 1, vector<int>(2)); int dp[k+1][2];memset(dp, 0, sizeof(dp));for (int i = 1; i <= k; i++) dp[i][0] = -prices[0];for (int i = 1; i < n; i++) {for (int j = 1; j <= k; j++) {dp[j][0] = max(dp[j][0], dp[j - 1][1] -prices[i]);dp[j][1] = max(dp[j][0] + prices[i], dp[j][1]);}}return dp[k][1];}
};
更多推荐
LeedCode 188. 买卖股票的最佳时机 IV
发布评论