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).
Accept: 7ms
思路:
- 同stack I,先求diff数组。
- 然后用diff数组里的负数作为分割,将数组分割成2个子数组,分别用stock I的方法求出最大值。
- 注意:diff里连续的负数可以合并成一个看待。
- 切成2个子数组的最大值还需要和一个完整diff的最大值进行对比。
int diff[100000];
int findProfit(int beg, int end) {
if (end <= beg) {
return 0;
}
int max = 0;
int sum = 0;
for (int i = beg; i < end; ++i) {
if (diff[i] + sum <= 0) {
sum = 0;
continue;
}
sum += diff[i];
if (sum > max) {
max = sum;
}
} // for
return max;
}
int maxProfit(int prices[], int n){
for (int i = 0; i < n - 1; ++i) {
diff[i] = prices[i+1] - prices[i];
}
for (int i = n - 2; i > 0; --i) {
if (diff[i] < 0 && diff[i - 1] < 0) {
diff[i - 1] += diff[i];
diff[i] = 0;
}
}
int max = findProfit(0, n - 1);
for (int i = 0; i < n - 2; ++i) {
if (diff[i] >= 0) {
continue;
}
int profit = findProfit(0, i) + findProfit(i + 1, n - 1);
if (profit > max) {
max = profit;
}
}
return max;
}