/** * 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] * * Tags: Dynamic Programming * Similar Problems: (M) Best Time to Buy and Sell Stock, (M) Best Time to Buy and Sell Stock II */ public class BestTimeToBuySellStockWithCooldown { /** * https://leetcode.com/discuss/71354/share-my-thinking-process * O(n) Time, O(1) Space */ public int maxProfit(int[] prices) { if (prices == null || prices.length < 2) return 0; int sell = 0, lastSell = 0, buy = -prices[0], lastBuy; for (int price : prices) { lastBuy = buy; buy = Math.max(lastSell - price, lastBuy); lastSell = sell; sell = Math.max(lastBuy + price, lastSell); } return sell; } }