leetcode -- 309. Best Time to Buy and Sell Stock with Cooldown

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)

Example:

Input: [1,2,3,0,2]
Output: 3
Explanation: transactions = [buy, sell, cooldown, buy, sell]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

思路:

1、见到很多这种买卖股票的题了,有最简单的买卖,还有限制交易次数的,还有交易费用,这个题是交易有冷冻期。

2、用三个记录,sell表示到第i天,是卖出股票时的最大收益,buy表示到第i天,是买进股票时的最大收益,cooldown表示到第i天,是冷冻期时的最大收益。

3、buy买进取决于前一天也买进或者前一天是冷冻期这天买进两者的最大值,即buy[i] = max(buy[i-1], cooldown[i-1]-price[i])

sell取决于前一天卖出了或者前一天买进今天卖出的最大值,即sell[i] = max(sell[i-1], buy[i-1]+price[i])

cooldown取决于前一天是卖出或者前一天也是冷冻期两者的最大值,即cooldown[i] = max(sell[i-1], cooldown[i-1])

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int size = prices.size();
        if(size==0) return 0;
        vector<int> cooldown(size);
        vector<int> buy(size);
        vector<int> sell(size);
        buy[0] = -prices[0];
        for(int i = 1; i < size; i++){
            buy[i] = max(buy[i-1],cooldown[i-1]-prices[i]);  //要买的那天,要么是前一天买进,要么是前一天是冷冻天
            sell[i] = max(sell[i-1],buy[i-1]+prices[i]);  //卖的那天,要么是前一天卖了,要么是前一天买了,进卖了
            cooldown[i] = max(sell[i-1], cooldown[i-1]);  //冷却那天,要么前一天也是冷却,要么是前一天卖了才是冷却
        }
        return sell.back();
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值