问题描述:
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
第一种方法:用一个二维数组记录i到i之后的差价。(负数直接填0),然后扫描二维数组,找到和的最大值。会超时。
第二种方法:先正序扫描求0~i天的最大利润,再倒序扫描求从i+1~n天的最大利润,放在两个数组内,最后求这两个数组第i项最大和。时间复杂度要低一些。
AC代码:
public int maxProfit(int[] prices) {
if(prices==null||prices.length==0)
return 0;
int[] first = new int[prices.length];
int[] last = new int[prices.length];
//计算0~i的最大收益
int min = prices[0];
for(int i=1;i<prices.length;i++){
min=Math.min(min, prices[i]);
first[i]=prices[i]-min;
}
int max=prices[prices.length-1];
//计算i~n的最大收益
for(int i=prices.length-2;i>=0;i--){
max = Math.max(max, prices[i]);
last[i]=Math.max(max-prices[i], last[i+1]);
}
//计算最大值
int maxProfit = last[0];
for(int i=0;i<prices.length-1;i++){
maxProfit = Math.max(maxProfit, first[i]+last[i+1]);
}
return maxProfit;
}