股票买卖问题(交易两次)
问题描述
- 给定一个数组代表股票每天的价格,请问只能买卖两次的情况下,最大化利润是多少
- 例如输入:{7,1,5,3,6,4}
- 第一次交易 5 - 1 = 4 第二次交易 6 - 3 = 3
- 最大利润为 4 + 3 = 7
算法思路
- 其实在明白了交易一次的算法实现思路之后,对于交易两次就显得比较简单了。只需要不断的将该数组进行切分,切分为两个数组,分别计算两个数组交易一次的最大价值即可。
- 首先定义dp1【i】矩阵,dp1【i】存储前 i 天交易一次的最大价值
- 之后定义dp2【i】矩阵,dp2【i】存储从第 i 天到最后一天交易一次的最大价值
- 然后不断的切分数组,求dp1【i】 + dp2【i + 1】的最大值即可
实现
public static int maxProfit1(int[] price){
int[] dp1 = new int[price.length];
dp1[0] = 0;
int minPrice = price[0];
for(int i = 1; i < price.length; i++){
dp1[i] = Math.max(price[i] - minPrice,dp1[i - 1]);
if(price[i] < minPrice) minPrice = price[i];
}
int[] dp2 = new int[price.length];
dp2[price.length - 1] = 0;
int maxPrice = price[price.length - 1];
for( int i = price.length - 2; i >= 0; i--){
dp2[i] = Math.max(maxPrice - price[i],dp2[i + 1]);
if(price[i] > maxPrice) maxPrice = price[i];
}
int maxValue = 0;
for(int i = 0; i < price.length - 1; i++){
maxValue = Math.max(maxValue,dp1[i] + dp2[i+1]);
}
return maxValue;
}