309.Best Time to Buy and Sell Stock with Cooldown

1.基本思路:

此题可通过DP来解决,但状态转移方程的构想不是那么明显,首先可以通过两个数组来表示买与卖的信息:

  • buy[i]:表示第i天为止,最近一次股票购入后所持有的利润
  • sell[i]:表示第i天为止,最近一次股票抛售后所持有的利润

其中:最近一次表示在第i天或者之前所做的股票交易。

2.状态转移方程

buy[i] = max(buy[i-1],sell[i-2]-prices[i]);     //越大,说明现有的利润越大,购入所付出的少
  • buy[i-1]:表示第i天之前最近一次股票购入后所持有的利润
  • sell[i-2]-prices[i]:考虑是否可以用更便宜的购入替换之前的购入,由于有cooldown的限定,所以要以之前两天抛售点为基础进行购入
sell[i] = max(sell[i-1],buy[i-1]+prices[i]);    //越大,说明抛售后的利润越大
  • sell[i-1]:表示第i天之前最近一次股票抛售后所持有的利润
  • buy[i-1]+prices[i]:考虑是否可以用更大的利润抛售股票

3.实现

由于在状态转移方程中所使用的buy,sell数组元素有限,所以可以同变量的形式替换,以达到o(1)的空间复杂度,o(n)的时间复杂度

 class Solution {
 public:
     int maxProfit(vector<int>& prices) {
         if (prices.size()<2) return 0;        //一次交易都无法进行
         int b,b1=INT_MIN;
         int s=0,s1=0,s2=0;                   
         for (int i=0;i<prices.size();++i)    //通过状态转移方程计算
         {
             b = max(b1,s2-prices[i]);
             s = max(s1,b1+prices[i]);
             b1=b,s2=s1,s1=s;
         }
         return s;                           //返回最终一次股票抛售后所持有的利润
     }
 };
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值