题目描述:
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
例:
思路:
是股票问题的升级版:
首先想到的思路是确定两个最大值,如果最小值发生改变,就像该差值放到两个最大值中,但是没有办法解决最后一天的问题。有大神的话欢迎指教一下,代码如下:
public int maxProfit(int[] prices) {
int max1 = 0;//初始化最大值
int max2 = 0;//初始化最大值
int min = Integer.MAX_VALUE;//初始化最小值
int cha = 0;
for (int i = 0; i < prices.length; i++) {
if (i == 0) {
min = prices[0];
}
if (i > 0) {
if (prices[i] > min) {
cha = prices[i] - min;
if (i == prices.length - 1) {
if (cha > max1 || cha > max2) {
if (max1 > max2) {
max2 = cha;
} else {
max1 = cha;
}
}
}
} else {
min = prices[i];
if (cha > max1 || cha > max2) {
if (max1 > max2) {
max2 = cha;
} else {
max1 = cha;
}
}
}
}
}
return max1 + max2;
}
结果分析:
这个代码没有办法解决最后一天的问题,所以是错误的,请大神如果有解决方案,还请多指教。
然后看了官方的阶梯方案,照葫芦画瓢写出了自己的代码,但是还是不能够完全吃透。直接代码奉上:
public int maxProfit(int[] prices) {
int max1 = 0;//初始化最大值
int max2 = 0;//初始化最大值
int min1 = Integer.MAX_VALUE;//初始化最小值
int min2 = Integer.MAX_VALUE;//初始化最小值
int cha = 0;
for (int i = 0; i < prices.length; i++) {
if (i==0){
min1 = min2 = Math.min(min1,prices[0]);
}else {
min1 = Math.min(min1,prices[i]);
max1 = Math.max(max1,prices[i]-min1);
min2 = Math.min(min2,prices[i]-max1);
max2 = Math.max(max2,prices[i]-min2);
}
}
return max2;
}
结果: