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 at most two transactions.
Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).Ref:http://fisherlei.blogspot.com/2013/01/leetcode-best-time-to-buy-and-sell_3958.html
http://www.cnblogs.com/jasonC/p/3417722.html
[Thoughts]
前后两遍遍历,算出当前位置之前和之后的最大利润。
One dimensional dynamic planning.
Given an i, split the whole array into two parts:[0,i] and [i+1, n], it generates two max value based on i, Max(0,i) and Max(i+1,n)So, we can define the transformation function as:Maxprofix = max(Max(0,i) + Max(i+1, n)) 0<=i<nPre-processing Max(0,i) might be easy, but I didn't figure an efficient way to generate Max(i+1,n) in one pass.
1 public class Solution { 2 public int maxProfit(int[] prices) { 3 if(prices == null || prices.length == 0){ 4 return 0; 5 } 6 7 int[] firstProfit = new int[prices.length]; 8 int min = prices[0]; 9 for(int i =1; i < prices.length; i++){10 min = Math.min(min, prices[i]);11 firstProfit[i] = Math.max(firstProfit[i-1], prices[i] - min);12 }13 14 int result = 0;15 int rightPeek = prices[prices.length-1];16 for(int i = prices.length-1; i >=0; i--){17 rightPeek = Math.max(rightPeek, prices[i]);18 result = Math.max(result, firstProfit[i] + rightPeek - prices[i]);19 }20 return result;21 }22 }