6/06/2014

108. Best Time to Buy and Sell Stock III

public class Solution {
    public int maxProfit(int[] prices) {
        if (prices.length<2) return 0;
       
        int res = 0;
        int[] before = new int[prices.length];
        int[] after = new int[prices.length];
       
        before[0] = 0;
        after[prices.length-1] = 0;
       
        int min = prices[0];
        int max = prices[prices.length-1];
       
        for (int i=1; i<prices.length; i++) {
            if (prices[i]>=min) before[i] = Math.max(prices[i]-min, before[i-1]);
            else {
                min = prices[i];
                before[i] = before[i-1];
            }
        }
       
        for (int i=prices.length-2; i>=0; i--) {
            if (prices[i]<=max) after[i] = Math.max(max-prices[i], after[i+1]);
            else {
                max = prices[i];
                after[i] = after[i+1];
            }
        }
       
        for (int i=0; i<prices.length; i++) {
            res = Math.max(res, before[i]+after[i]);
        }
       
        return res;
    }
}

1 条评论:

  1. 1. 第i天的最大利益等于这天之前的最大利益+这天之后的最大利益,找出最大的.
    2. before[] 和 after[] 两个数组储存,单调递增或递减.
    3. 求出before[i]+after[i]最大值.

    回复删除