问题描述:
Say you have an array for which the ith element is the price of a given stock on day i.
给你一个数组,里边的第i个元素存储的是股票在第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)。进行两次交易,分别从前往后遍历和从后往前遍历
数组p1[i]记录了price[0..i]的最大收益
数组p2[i]记录了price[i..n]的最大收益
已知p1[i-1],可以求p1[i];已知p2[i+1],可以求p2[i]。
最后,我们再用O(n)的时间找出max(p1[i]+p2[i])即可。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
if(n <= 1){
return 0;
}
//[0,...,i]区域内买进卖出最大收益
vector<int> p1(n);//定义向量对象p1,包含了n个值为0的元素
//[i,...,n-1]区域内买进卖出最大收益
vector<int> p2(n);
int minimum = prices[0];
for(int i=1;i<n;i++){//[0,...,i]区域,从前往后遍历
//更新最低价格
minimum = prices[i]<minimum?prices[i]:minimum;
//动态规划
p1[i] = max(p1[i-1], prices[i]-minimum);
}
int maximum = prices[n-1];
for(int i=n-2;i>=0;i--){//[i,...,n-1]区域,从后往前遍历
//更新最高价格
maximum = prices[i]>maximum?prices[i]:maximum;
//动态规划
p2[i] = max(p2[i+1], maximum-prices[i]);
}
int max_profit = 0;
int profit = 0;
for(int i=0;i<n;i++){
profit = p1[i] + p2[i];
max_profit = profit>max_profit?profit:max_profit;
}
return max_profit;
}
};