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).
思路:
想O(N)的算法,
F[i]表示,在第i天卖出一次最大利润(1次)
G[i]表示,在第i天买入,后面某天卖出最大利润(1次)
结合F和G的结果即可
class Solution {
public:
int maxProfit(vector<int> &prices) {
vector<int> &A = prices;
int n = A.size();
if(n <= 1)return 0;
vector<int> F(n, 0), G(n, 0), K(n, 0);
F[0] = 0;
for(int i = 1; i < n; ++i){
F[i] = max(0, max(F[i - 1] - A[i - 1] + A[i], A[i] - A[i - 1]));
// cout << i << ':' << F[i] << endl;
}
//cout << endl;
G[n - 1] = 0;
for(int i = n - 2; i >= 0; --i){
G[i] = max(0, max(G[i + 1] + A[i + 1] - A[i], A[i + 1] - A[i]));
//cout << i << ':' << G[i] << endl;
}
//cout << endl;
K[n - 1] = G[n - 1];
for(int i = n - 2; i >= 0; --i){
K[i] = max(G[i], K[i + 1]);
// cout << i << ':' << K[i] << endl;
}
int ans = max(K[0], F[n - 1]);
for(int i = 0; i < n - 1; ++i){
ans = max(ans, F[i] + K[i + 1]);
}
return ans;
}
};