309. Best Time to Buy and Sell Stock with Cooldown

来源:互联网 发布:tina8.0电路仿真软件 编辑:程序博客网 时间:2024/06/04 06:54

Say you have an array for which the ith element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times) with the following restrictions:

  • You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
  • After you sell your stock, you cannot buy stock on next day. (ie, cooldown 1 day)


Example:

prices = [1, 2, 3, 0, 2]maxProfit = 3

transactions = [buy, sell, cooldown, buy, sell]

There are totally 3 states, buy, sell and cool.

buy[i] means holding stock at the end of day i;

sell[i] means sell the stock at day i;

cool[i] means do not hold the stock at the end of day i - 1.


buy[i] = Math.max(buy[i - 1], cool[i - 1] = prices[i]).

The first condition is hold the stock at day i -1 and do no transaction.

The second condition is in cool time at day i - 1 and buy stock at day[i];


sell[i] = buy[i - 1] + prices[i]

it means hold the stock and day i - 1 and sell it at day[i]


cool[i] = Math.max(cool[i - 1], sell[i - 1])

The first condition means already in cool at day i - 1 and do not transaction.

The second condition means sell the stock at day i - 1 and today is the first cool down day.


Code:

public class Solution {    public int maxProfit(int[] prices) {        if(prices.length <= 1) return 0;        int[] buy = new int[prices.length];        int[] sell = new int[prices.length];        int[] cool = new int[prices.length];        buy[0] = -prices[0];        for(int i = 1; i < prices.length; i++){            buy[i] = Math.max(buy[i - 1], cool[i - 1] - prices[i]);            sell[i] = buy[i - 1] + prices[i];            cool[i] = Math.max(cool[i - 1], sell[i - 1]);        }        return Math.max(sell[prices.length - 1],cool[prices.length - 1]);    }}








0 0