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).
Analysis:
We calculate two things:1. from day 0 to day i, what the maximum profit we can get by performing only one transcation. 2. from any day i to the end, what the maximum profit we can get by performing one transcation. We then find out the maximum profit by adding them up for each day.
Solution:
1 public class Solution { 2 public int maxProfit(int[] prices) { 3 int len = prices.length; 4 if (len==0 || len==1) return 0; 5 6 int[] posProfit = new int[len]; 7 int[] negProfit = new int[len]; 8 9 int maxProfit = 0; 10 int curProfit = 0; 11 int minPrice = prices[0]; 12 for (int i=0;i<len;i++){ 13 if (minPrice>prices[i]) minPrice = prices[i]; 14 curProfit = prices[i]-minPrice; 15 if (curProfit>maxProfit) maxProfit = curProfit; 16 posProfit[i] = maxProfit; 17 } 18 19 maxProfit = 0; 20 curProfit = 0; 21 int maxPrice = prices[len-1]; 22 for (int i=len-1;i>=0;i--){ 23 if (maxPrice<prices[i]) maxPrice = prices[i]; 24 curProfit = maxPrice-prices[i]; 25 if (curProfit>maxProfit) maxProfit = curProfit; 26 negProfit[i]=maxProfit; 27 } 28 29 int res = 0; 30 for (int i=0;i<len;i++) 31 if (res<posProfit[i]+negProfit[i]) res = posProfit[i]+negProfit[i]; 32 33 return res; 34 } 35 }