一句话总结:还是股票II的变形。
原题链接:309 买卖股票的最佳时机含冷冻期
这里比股票II多了个冷冻期的限制,于是多设置一个状态freeze,那么它就将初始化为freeze = 0(尽管第一天不可能是冷冻期);同时计算第i天的状态递推公式也将有些变化:
-
newBuy = Math.max(buy, freeze - prices[i]);
-
newSeal = buy + prices[i];
-
newFreeze = Math.max(freeze, seal);
即第i天的买股票最大收益由前一天为没有操作,或者前一天是冷冻期转移而来;第i天卖股票的最大收益由前一天持有股票,今天卖出而来;冷冻期的最大收益由前一天是冷冻期,或者当天即卖出得到的收益最大而来。代码如下:
class Solution {
public int maxProfit(int[] prices) {
int buy = -prices[0], seal = 0, freeze = 0;
for (int i = 1; i < prices.length; ++i) {
int newBuy = Math.max(buy, freeze - prices[i]);
int newSeal = buy + prices[i];
int newFreeze = Math.max(freeze, seal);
buy = newBuy;
seal = newSeal;
freeze = newFreeze;
}
return Math.max(seal, freeze);
}
}
原题链接:714 买卖股票的最佳时机含手续费
此题也是股票II的变形,无非多了手续费的条件。由于整个交易过程只收一次手续费,那么将收费的过程放在卖出股票时即可。此题需要小心的是sell状态的初始化,一定要初始化为0。
class Solution {
public int maxProfit(int[] prices, int fee) {
int buy = -prices[0], sell = 0;
for (int i = 1; i < prices.length; ++i) {
sell = Math.max(sell, buy + prices[i] - fee);
buy = Math.max(buy, sell - prices[i]);
}
return sell;
}
}