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).
My code:
public class Solution {
public int maxProfit(int[] prices) {
if (prices.length<=1)
return 0;
int min=prices[0];
int l = prices.length;
int[] pro1 = new int[l];
int[] pro2 = new int[l];
for(int i=1;i<l;i++){
if(prices[i]<min)
min = prices[i];
if(pro1[i-1] < prices[i]-min)
pro1[i] = prices[i]-min;
else
pro1[i]=pro1[i-1];
}
int max = prices[l-1];
for(int i=l-2;i>=0;i--){
if(prices[i]>max)
max = prices[i];
if(max - prices[i] > pro2[i+1])
pro2[i]=max- prices[i];
else
pro2[i]=pro2[i+1];
}
int pro = pro1[0]+pro2[0];
for(int i=0;i<l;i++){
if (pro<pro1[i]+pro2[i])
pro = pro1[i]+pro2[i];
}
return pro;
}
}
Neat one:
public int maxProfit(int[] prices) {
int N = prices.length;
if(N == 0) return 0;
int[] M1 = new int[N];
int[] M2 = new int[N];
int minPrice = prices[0];
for(int i = 1; i < N; i++){
minPrice = Math.min(minPrice, prices[i]);
M1[i] = Math.max(M1[i-1], prices[i]-minPrice);
}
int maxPrice = prices[N-1];
for(int i = N-2; i >= 0; i--){
maxPrice = Math.max(maxPrice, prices[i]);
M2[i] = Math.max(M2[i+1], maxPrice-prices[i]);
}
int best = 0;
for(int i = 0; i < N; i++){
best = Math.max(best, M1[i]+M2[i]);
}
return best;
}