Best Time to Buy and Sell Stock III 题解
题目来源:Best Time to Buy and Sell Stock III
>
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).解题思路:
从Best Time to Buy and Sell Stock可知, 可以在O(n)的时间内,可以得到某个区间内的一次交易最大利润。设i从1到n-2,那么针对每一个i,看看在prices的子序列[0,...,i][i,...,n-1]上分别取得的最大利润即可,时间复杂度是O(n^2)。
int maxSub(vector<int> &prices, int start, int end)
{
vector<int> dp(end-start+1);
dp[0] = 0;
int min = prices[start];
for(int i = start+1; i <= end; i++)
{
dp[i-start] = std::max(dp[i-start-1], prices[i]-min);
min = std::min(min, prices[i]);
}
return dp[end-start];
}
int maxProfit(vector<int> &prices)
{
int n = prices.size();
if(n <= 1) return 0;
int result = 0;
for(int i = 1; i < n-1; i++)
{
result = std::max(result,
maxSub(prices, 0, i) + maxSub(prices, i+1, n-1)
);
}
return result;
}可惜上面代码超时。
改进:那就是第一步扫描,先计算出子序列[0,...,i]中的最大利润,用一个数组保存下来,那么时间是O(n)。第二步是逆向扫描,计算子序列[i,...,n-1]上的最大利润,这一步同时就能结合上一步的结果计算最终的最大利润了,这一步也是O(n)。ref Here 另外,此类问题这里有分析.
Last updated
Was this helpful?