题意;
一个数组表示一支股票的每一天的价格,每一天可以买入或者卖出,但是买入时不能已经拥有这只股票,且卖出和买入必须间隔一天。
分析:
这题比较难也比较乱,不是很能理出头绪,不过多理一下也总有头绪。发现一些思路不可行,比如存储所有上升的值,之和再减去由于冷却产生的不能赚取的利润中较小的。发现第一这种办法麻烦,第二这种办法不具有一般性,我们还是用动态规划的方法:
我们来看第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];
}
}