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).
先用dp[i]表示当前下标之前最低价格,再把dp[i]变成当前下标前最大利润,其实这可以一次循环做完; O(n)
然后从后遍历prices如果i到n-1的最大利润加dp[i]大于(相当于两次交易)结果,更新结果max_sum;O(n)
总的时间复杂度O(n)
class Solution {
public:
int maxProfit(vector<int> &prices) {
if( prices.size() < 2)
return 0;
vector< int> dp( prices.size(), INT_MIN);
dp[0] = prices[0];
for( int i = 1; i < prices.size(); ++i){
dp[i] = min( dp[i-1], prices[i]);
}
for( int i = 0; i < dp.size(); ++i){
dp[i] = prices[i] - dp[i];
}
int max_sum = dp[dp.size()-1];//两次交易最大的和
int high_price = prices[prices.size()-1];//i到n-1最大价格
int max_part = 0;//i到n-1最大利润
for( int i = prices.size() - 2; i >= 0; --i){
int tmp_max_part = high_price - prices[i];//临时i到n-1最大利润
max_part = max_part > tmp_max_part ? max_part : tmp_max_part;
int tmp_max_sum = max_part + dp[i];//临时两次交易最大的和
max_sum = max_sum > tmp_max_sum ? max_sum : tmp_max_sum;
high_price = high_price > prices[i] ? high_price : prices[i];//更新i到n-1最大价格
}
return max_sum;
}
};