标签:
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 I问题。
两次股票交易的核心是可以定义一个交易点,在这个交易点之前可以做一次交易(赚的最大数目的钱为firstProf),在这个交易点之后可以做一个交易(赚的最大数目的钱是secondProf)。那么要求的是max(firstProf+secondProf)。但是这个方法的时间复杂度是O(N^2),空间复杂度是O(1)。leetcode中显示超时。
可以使用两次扫描的方法避免上面的双重循环。
不同于Best Time to Buy and Sell Stock I中定义的初始状态A[i]表示第i天卖出挣的最大数目的钱,这个更进一步直接定义A[i]表示前i天赚的最大数目的钱。minPrice表示从第0天到第i-1天中的最低价格。
A[0]=0。(初始状态)
A[1]=max(prices[1]-prices[0],A[0])
A[2]=max(prices[2]-minPrice,A[1])
.....
即A[i]=max(price[i]-minPrice,A[i-1]).
A[0]=0
另外一次扫描从数组后向前扫描,定义B[i]表示从第i天到最后一天n能赚的最大数目的钱。maxPrice表示第i+1天到n天的最高价格。
B[n]=0。(初始状态)
B[n-1]=max(maxPrice-prices[n-1],B[n])
B[n-2]=max(maxPrice-prices[n-2],B[n-1])
.....
即B[i]=max(maxPrice-prices[i],B[i+1])
B[n]=0
那么以第i天为分割点能赚的最多数目的钱为A[i]+B[i]
问题的解为max{A[i]+B[i]}。0<=i<=n。
时间复杂度是O(N),空间复杂度是O(N)。
runtime:8ms
class Solution { public: int maxProfit(vector<int>& prices) { int length=prices.size(); if(length==0||length==1) return 0; int * ascandMax=new int[length](); int minPrice=prices[0]; int maxProf=0; for(int i=1;i<length;i++) { maxProf=max(maxProf,prices[i]-minPrice); minPrice=min(minPrice,prices[i]); ascandMax[i]=maxProf; } int* descandMax=new int[length](); int maxPrice=prices[length-1]; maxProf=0; for(int i=length-2;i>=0;i--) { maxProf=max(maxProf,maxPrice-prices[i]); maxPrice=max(maxPrice,prices[i]); descandMax[i]=maxProf; } maxProf=0; for(int i=0;i<length;i++) { maxProf=max(maxProf,ascandMax[i]+descandMax[i]); } delete [] ascandMax; delete [] descandMax; return maxProf; } };
LeetCode123:Best Time to Buy and Sell Stock III
标签:
原文地址:http://blog.csdn.net/u012501459/article/details/46514309