leetcode_middle_46_309. Best Time to Buy and Sell Stock with Cooldown

本文探讨了在特定交易规则下实现股票最大利润的动态规划方法。通过维护买入和卖出两种状态的最大收益,解决了间隔一天买卖的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意;

一个数组表示一支股票的每一天的价格,每一天可以买入或者卖出,但是买入时不能已经拥有这只股票,且卖出和买入必须间隔一天。

分析:                                                                                                                                 

这题比较难也比较乱,不是很能理出头绪,不过多理一下也总有头绪。发现一些思路不可行,比如存储所有上升的值,之和再减去由于冷却产生的不能赚取的利润中较小的。发现第一这种办法麻烦,第二这种办法不具有一般性,我们还是用动态规划的方法:

我们来看第i天的利润,

1 可能是头一天的利润的保持,这一天什么都没做

2 可能是头一天买入之后的利润加上这一天卖出的价格,就是这一天的利润,

3 可能是头两天的卖出之后的利润加上这一天买入的利润。

但是,我们发现2,3分别要求我们能确定其头一天正好是买入,头两天正好是卖出。但是我们无法判断,也就是说,这个数组存储的信息不够,不能够存储是处于买入状态还是卖出状态。

所以一种办法是,用两个数组表示买入状态时的最大利润和卖出状态的最大利润:

public class Solution {
   public int maxProfit(int[] prices) {
    int len = prices.length;
    int[] buy = new int[len+1];
    int[] sell = new int[len+1];
    if (prices.length <= 1) {
            return 0;
    }
    buy[1] = -prices[0];
    sell[1] = 0;
    for (int i=2;i<=len;i++) {
            buy[i] = Math.max(buy[i - 1], sell[i - 2] - prices[i-1]);   //前一天买入状态,这一天保持 /  前两天卖掉状态,今天买入
            sell[i] = Math.max(sell[i - 1], buy[i - 1] + prices[i-1]);  //前一天卖出状态,这一天保持 /  前一天买入状态,今天卖出
    }
    return sell[len];
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值