309. Best Time to Buy and Sell Stock with Cooldown
Description:
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 as many transactions as you like (ie, buy one and sell one share of the stock multiple times) with the following restrictions:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
After you sell your stock, you cannot buy stock on next day. (ie, cooldown 1 day)
Difficulty:Medium
Example:
Input: [1,2,3,0,2]
Output: 3
Explanation: transactions = [buy, sell, cooldown, buy, sell]
方法1:动态规划
- Time complexity : O ( n ) O\left ( n \right ) O(n)
- Space complexity :
O
(
n
)
O\left ( n \right )
O(n)
思路:
建两个数组,buy和sell,分别记录当天状态是buy或者sell的max profit
buy[i] = max(sell[i-2]-price, buy[i-1])
sell[i] = max(buy[i-1]+price, sell[i-1])
class Solution {
public:
int maxProfit(vector<int> &prices) {
int max_profit = 0, n = prices.size();
if(n < 2) return 0;
vector<int> buy(n, 0), sell(n, 0);
buy[0] = -prices[0];
buy[1] = max(-prices[1], buy[0]);
sell[1] = max(buy[0] + prices[1], sell[0]);
max_profit = max(max_profit, sell[1]);
for(int i = 2; i < n; i++){
buy[i] = max(sell[i-2] - prices[i], buy[i-1]);
sell[i] = max(buy[i-1] + prices[i], sell[i-1]);
max_profit = max(max_profit, sell[i]);
}
return max_profit;
}
};
方法2:动态规划, 空间优化
- Time complexity : O ( n ) O\left ( n \right ) O(n)
- Space complexity :
O
(
1
)
O\left ( 1 \right )
O(1)
思路:
根据dp公式我们可以看出,我们只需要i, i-1, i-2
三个时刻的值即可,故省去数组空间
buy[i] = max(sell[i-2]-price, buy[i-1])
sell[i] = max(buy[i-1]+price, sell[i-1])
注意:prev_sell指向的是i-2,所以用完之后再更新,但prev_buy是指向i-1,更新完再用
class Solution {
public:
int maxProfit(vector<int> &prices) {
int buy(INT_MIN), sell(0), prev_sell(0), prev_buy;
for (int price : prices) {
buy = max(prev_sell - price, buy);
prev_sell = sell;//注意区别!!!
prev_buy = buy;
sell = max(prev_buy + price, sell);
}
return sell;
}
};