问题
例子
思路
动态规划【最】
冷冻:即买入卖出后的over状态
每天的状态:当天卖出,当天冷冻,当天买入,当前是买入后的无操作。
可压缩为3中状态:当前卖出,当天冷冻,当天持有
状态转换:
卖出的前一天:必须是持有状态
持有的前一天,持有或者是冷冻【因为卖出后,必须冷冻才能再次买入】
冷冻的前一天:冷冻或者卖出
-
方法1 O(n) O(n)
$$$$
-
方法2 O(n) O(1)
$$$$
代码
//方法1
public int maxProfit(int[] prices) {
if(prices.length==0) return 0;
int len = prices.length;
//记录到第i天最后一个操作是买进的最大收益
int[] hold = new int[len];
//记录第i天卖出的最大收益
int[] sell = new int[len];
//记录到第i天是冻结状态的最大收益
int[] over = new int[len];
hold[0] = -prices[0];
for(int i=1; i<len; i++) {
hold[i] = Math.max(hold[i-1], over[i-1]-prices[i]);
sell[i] = hold[i-1]+prices[i];
over[i] = Math.max(over[i-1], sell[i-1]);
}
return Math.max(over[len-1], sell[len-1]);
//方法2
public int maxProfit(int[] prices) {
if(prices.length==0) return 0;
int len = prices.length;
int hold=-prices[0],over=0,sell=0;
for(int i=1; i<len; i++) {
int pre_hold = hold;
int pre_sell = sell;
hold = Math.max(over-prices[i], pre_hold);
sell = pre_hold + prices[i];
over = Math.max(pre_sell, over);
}
return Math.max(sell, over);