给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
示例:
输入: [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
这里的操作可以是买、卖、什么也不做(包括冷冻期)
建立buy和sell数组:
buy[i]表示第i天操作后手上有股票的最大收益
sell[i]表示第i天操作后手上没有股票的最大收益
那么:
第i天手上有股票时有两种情况:
1.第i天买入了股票,这时说明i-1天以前卖过股票,因为有一天的冷淡期,所以要去i-2天前手上没有股票的最大收益sell(i-2)-price[i]
2.第i-1天就已经买入了,第i天什么也不干
第i天手上没有股票时有两种情况:
1.第i天卖了股票,说明i-1天结束后就有股票,buy[i-1]+price[i]
2.第i-1天就卖了,第i天什么也不干sell[i-1]
则最后一天卖出时受益最大
代码实现:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len=prices.size();
if(len<=1){ //如果只有一天就只能买进没有利润
return 0;
}
vector<int> buy(len,0);//第i天手上有股票的最大收益
vector<int> sell(len,0);//第i天手上没有股票的最大收益
buy[0]-=prices[0];//第一天只能买入且需要花钱
for(int i=1;i<len;i++){
/*第i天手上没有股票的最大收益:
1.i天当天卖出去了,说明i-1前就有了股票
2.第i-1天就卖了*/
sell[i]=max(buy[i-1]+prices[i],sell[i-1]);
if (i==1) //防止i-2出现段错误,第二天手上有股的收益取第一天和第二天便宜的那支股买入
buy[i]=max(buy[i-1],-prices[i]);
else
/*第i天手上有股票的最大收益:
1.i天买,说明i-2天卖了,i-1天冷静
2.第i-1天之前就买了*/
buy[i]=max(sell[i-2]-prices[i],buy[i-1]);
}
return sell[len-1];
}
};