Best Time to Buy and Sell Stock III
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).
解题思路:
题目规定最多两次交易,而不一定是两次交易。若为一次交易可以视为在中间某一天卖出有买进。
动态规划形式化分析:
设状态函数 f(i) 表示数组下标区间[0,i] 的最大利润; 状态函数g(i) 表示数组下标区间[i,n-1]的最大利润; 其中 0<= i <= n-1 。
则最终答案为max{ f(i) + g(i) }, 0<= i <= n-1。
状态函数f(i) 的转换函数为: f(i) = max( f(i-1), prices[i] - curMin); //curMin 表示prices数组0 - (i-1) 下标中值的最小值。
状态函数f(i) 的转换函数为: g(i) = max( g(i+1), curMax-prices[i]); //curMax 表示prices数组i - (n-1) 下标中值的最大值。
备注:
若将原数组变成差分数组,本题就可以看做是最大m子段和(其中m=2)的问题。
程序源代码:
Java源代码:
public int maxProfit(int[] prices) {
if (prices.length < 2) {
return 0;
}
int[] f = new int[prices.length];
f[0]=0;
for (int i = 1, curMin = prices[0]; i < prices.length; ++i) {
f[i]=Math.max(prices[i]-curMin, f[i-1]);
curMin = Math.min(curMin, prices[i]);
}
int[] g= new int[prices.length];
g[prices.length-1]=0;
for(int i=prices.length-2,curMax=prices[prices.length-1]; i>-1; --i){
g[i]=Math.max(g[i+1], curMax-prices[i]);
curMax= Math.max(curMax, prices[i]);
}
int maxProfit = 0;
for( int i=0; i<prices.length; ++i){
maxProfit = Math.max(maxProfit, f[i]+g[i]);
}
return maxProfit;
}
附录:
相关题目:
LeetCode--Best Time to Buy and Sell Stock (贪心策略 or 动态规划)
LeetCode -- Best Time to Buy and Sell Stock II (贪心策略,差分序列)