假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格。设计一个算法来找到最大的利润。你最多可以完成两笔交易。
注意事项
你不可以同时参与多笔交易(你必须在再次购买前出售掉之前的股票)
样例
给出一个样例数组 [4,4,6,1,1,4,2,5], 返回 6
利用两个数组left 和right,left[i]存第i天及之前的某一天卖掉股票能赚到的最大利润,right[i]存第i天及第i天之后的某一天买进股票最终能获得的最大利润。最后对两个数组遍历,求得最大的利润。
代码如下:
public class Solution {
/*
* @param prices: Given an integer array
* @return: Maximum profit
*/
public int maxProfit(int[] prices) {
// write your code here
if(prices.length==0){
return 0;
}
int[] left=new int[prices.length];
int[] right=new int[prices.length];
int buy,sold,profit=0;
buy=prices[0];
for(int i=1;i<prices.length;i++){//第i天及之前某一天卖掉股票
sold=prices[i];
if(sold<buy){//如果卖价低于买价,更新买价,这一天卖掉股票的利润更新为 之前最大的利润。
buy=sold;
left[i]=profit;
}
else if(sold-buy<profit){//如果卖价高于买价,比较当前利润和之前最大利润,相应更新。
left[i]=profit;
}
else{
profit=sold-buy;
left[i]=profit;
}
}
sold=prices[prices.length-1];
profit=0;
for(int i=prices.length-2;i>=0;i--){//第i天及之后某一天买进股票,从后向前更新
buy=prices[i];
if(sold<buy){
sold=buy;
right[i]=profit;
}
else if(sold-buy<profit){
right[i]=profit;
}
else {
profit=sold-buy;
right[i]=profit;
}
}
int max=0;
for(int i=0;i<left.length-1;i++){//遍历两个数组,比较最大的利润和。第i天及之前某一天卖掉股份的最大利润加上第i+1天及之后某一天买进股份的最大利润
if(left[i]+right[i+1]>max){
max=left[i]+right[i+1];
}
}
if(left[left.length-1]>max){//只卖一次。
max=left[left.length-1];
}
if(right[0]>max){//只买一次
max=right[0];
}
return max;
}
}