class Solution {
public:
int maxProfit(vector<int>& prices) {
if (prices.size() <= 1) return 0;
vector<int> left(prices.size(), 0);
vector<int> right(prices.size(), 0);
int min_p = prices[0];
int max_p = prices.back();
for (int i = 1; i < prices.size(); ++i) {
min_p = min(min_p, prices[i]);
left[i] = max(left[i-1], prices[i]-min_p);
}
for (int i = prices.size()-2; i >= 0; --i) {
max_p = max(max_p, prices[i]);
right[i] = max(right[i+1], max_p-prices[i]);
}
int result = 0;
for (int i = 0; i < prices.size(); ++i) {
result = max(result, left[i]+right[i]);
}
return result;
}
};
- AC
- 16ms
- beat 4.53%
best solution in discuss
public class Solution {
public int maxProfit(int[] prices) {
int hold1 = Integer.MIN_VALUE, hold2 = Integer.MIN_VALUE;
int release1 = 0, release2 = 0;
for(int i:prices){ // Assume we only have 0 money at first
release2 = Math.max(release2, hold2+i); // The maximum if we've just sold 2nd stock so far.
hold2 = Math.max(hold2, release1-i); // The maximum if we've just buy 2nd stock so far.
release1 = Math.max(release1, hold1+i); // The maximum if we've just sold 1nd stock so far.
hold1 = Math.max(hold1, -i); // The maximum if we've just buy 1st stock so far.
}
return release2; ///Since release1 is initiated as 0, so release2 will always higher than release1.
}
}