/**
 * Say you have an array for which the ith element is the price of a given stock on day i.
 *
 * If you were only permitted to complete at most one transaction (i.e., buy one and sell one share of the stock), design an algorithm to find the maximum profit.
 *
 * Note that you cannot sell a stock before you buy one.
 *
 * Example 1:
 *
 * Input: [7,1,5,3,6,4]
 * Output: 5
 * Explanation: Buy on day 2 (price = 1) and sell on day 5 (price = 6), profit = 6-1 = 5.
 *              Not 7-1 = 6, as selling price needs to be larger than buying price.
 * Example 2:
 *
 * Input: [7,6,4,3,1]
 * Output: 0
 * Explanation: In this case, no transaction is done, i.e. max profit = 0.
 *
 * Approach: Use dynamic programming to figure out when to use the valley approach.
 * Time complexity: O(n)
 * Memory complexity: O(1)
 *
 */
public class BuySellStockII {
    public int maxProfit(int[] prices) {
        if (prices.length == 0) return 0;
        int accProfit = 0, profit = 0, previous = prices[0];
        for (int i = 1; i < prices.length; i++) {
            profit = Math.max(profit, prices[i] - previous);
            previous = Math.min(previous, prices[i]);
            if (prices[i - 1] < prices[i] &&
                    (i + 1 >= prices.length || prices[i] >= prices[i + 1])) {
                accProfit += profit;
                previous = prices[i];
                profit = 0;
            }
        }
        return accProfit;
    }
    public void test() {
        System.out.println(maxProfit(new int[]{7,1,5,3,6,4}));
    }
}
