跳至主要内容

188. Best Time to Buy and Sell Stock IV

/*
* @lc app=leetcode id=188 lang=cpp
*
* [188] Best Time to Buy and Sell Stock IV
*
* https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iv/description/
*
* algorithms
* Hard (45.01%)
* Likes: 7593
* Dislikes: 212
* Total Accepted: 534.4K
* Total Submissions: 1.2M
* Testcase Example: '2\n[2,4,1]'
*
* You are given an integer array prices where prices[i] is the price of a
* given stock on the i^th day, and an integer k.
*
* Find the maximum profit you can achieve. You may complete at most k
* transactions: i.e. you may buy at most k times and sell at most k times.
*
* Note: You may not engage in multiple transactions simultaneously (i.e., you
* must sell the stock before you buy again).
*
*
* Example 1:
*
*
* Input: k = 2, prices = [2,4,1]
* Output: 2
* Explanation: Buy on day 1 (price = 2) and sell on day 2 (price = 4), profit
* = 4-2 = 2.
*
*
* Example 2:
*
*
* Input: k = 2, prices = [3,2,6,5,0,3]
* Output: 7
* Explanation: Buy on day 2 (price = 2) and sell on day 3 (price = 6), profit
* = 6-2 = 4. Then buy on day 5 (price = 0) and sell on day 6 (price = 3),
* profit = 3-0 = 3.
*
*
*
* Constraints:
*
*
* 1 <= k <= 100
* 1 <= prices.length <= 1000
* 0 <= prices[i] <= 1000
*
*
*/

// @lc code=start
class Solution {
public:
int maxProfit(int k, vector<int>& prices)
{
int n = prices.size();

if (n == 0) return 0;

if (k >= n) return getMaxProfit(prices);

vector<int> curMaxProfit(k + 1, 0);
vector<int> maxProfit(k + 1, 0);

for (int i = 1; i < n; i++)
{
int diff = prices[i] - prices[i - 1];
for (int j = k; j >= 1; j--)
{
curMaxProfit[j] = max(curMaxProfit[j] + diff, maxProfit[j - 1] + max(0, diff));
maxProfit[j] = max(maxProfit[j], curMaxProfit[j]);
}
}
return maxProfit[k];
}
int getMaxProfit(vector<int>& prices)
{
int maxProfit = 0;
for (int i = 1; i < prices.size(); i++)
{
if (prices[i] > prices[i - 1])
{
maxProfit += prices[i] - prices[i - 1];
}
}
return maxProfit;
}
};
// @lc code=end
  • T: O(nk)O(n \cdot k)
  • S: O(nk)O(n \cdot k)