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).
【题目分析】
用一个数组表示股票每天的价格,数组的第i个数表示股票在第i天的价格。最多交易两次,手上最多只能持有一支股票,求最大收益。
【思路】
动态规划法。以第i天为分界线,计算第i天之前进行一次交易的最大收益preProfit[i],和第i天之后进行一次交易的最大收益postProfit[i],最后遍历一遍,max{preProfit[i] + postProfit[i]} (0≤i≤n-1)就是最大收益。第i天之前和第i天之后进行一次的最大收益求法同Best Time to Buy and Sell Stock I。
【java代码】
1 public class Solution { 2 public int maxProfit(int[] prices) { 3 if(prices.length < 2) return 0; 4 5 int n = prices.length; 6 int preProfit[] = new int[n]; 7 int postProfit[] = new int[n]; 8 9 int curMin = prices[0]; 10 for(int i = 1; i < n; i++){ 11 curMin = Math.min(curMin, prices[i]); 12 preProfit[i] = Math.max(preProfit[i-1], prices[i] - curMin); 13 } 14 15 int curMax = prices[n-1]; 16 for(int i = n-2; i >= 0; i--){ 17 curMax = Math.max(curMax, prices[i]); 18 postProfit[i] = Math.max(postProfit[i+1], curMax - prices[i]); 19 } 20 21 int maxProfit = 0; 22 for (int i = 0; i < n; i++) { 23 maxProfit = Math.max(maxProfit, preProfit[i] + postProfit[i]); 24 } 25 26 return maxProfit; 27 } 28 }