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).
思路:首先只能两次transaction,而且是有先后顺序的,那么就是左边一段和右边一段的利润最大和。
那么就是以i为中点,[0,i-1] [i,n] 这两段之间利润的和。
左右两边的和,让我们想到了先计算从左往右走所能看到的利润和,生成一个矩阵, left[i] 表示从左往右走,当前所能够得到的最大利润。
然后再计算从右往左走,所能够得到的利润和,right[i] 表示从右往左走,当前所能够看到的最大利润。
然后取两者和最大,注意可以在同一天,买卖股票;只要保证卖了再买就行;
Prices: 1 4 5 7 6 3 2 9
left = [0, 3, 4, 6, 6, 6, 6, 8]
right= [8, 7, 7, 7, 7, 7, 7, 0]
class Solution {
public int maxProfit(int[] prices) {
int n = prices.length;
int[] left = new int[n];
left[0] = 0;
int leftmin = prices[0];
for(int i = 1; i < n; i++) {
leftmin = Math.min(leftmin, prices[i - 1]);
left[i] = Math.max(left[i - 1], prices[i] - leftmin);
}
int[] right = new int[n];
right[n - 1] = 0;
int rightmax = prices[n - 1];
for(int i = n - 2; i >= 0; i--) {
rightmax = Math.max(rightmax, prices[i + 1]);
right[i] = Math.max(right[i + 1], rightmax - prices[i]);
}
int globalmax = 0;
for(int i = 0; i < n; i++) {
globalmax = Math.max(globalmax, left[i] + right[i]);
}
return globalmax;
}
}