Leetcode每日一题 最佳买卖股票时机含冷冻期

给定一个整数数组,其中第 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];

    }
};

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值