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).

最多只能购买两次,那么以i为划分,计算以i结尾的左边子数组的最大交易,和以i开头的右边子数组的最大交易。

问题转换为求两个子数组的最大利益,这个就是Best Time to Buy and Sell Stock I,总的时间复杂度是O(n^2);

再做优化,先从左到右计算以i结尾的最大利益,这个可以在o(n)的时间内完成,

然后从末尾开始往前遍历,计算从[n,i]的最大利益。

那么最大利益就是在i这个划分上的左边的最大+右边的最大。

其实这个题和还有一个题很相似,就是,以A[1..n]数组构造B[1..n],使得B[i]=A[1]*A[2]*...*A[i-1]*A[i+1]*...A[n];

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int pricesSize = prices.size();
        if(pricesSize<=1){
            return 0;
        }
        int lowPrice = prices[0];
        vector<int> maxProfits(pricesSize,0);
        for(int i=1;i<pricesSize;i++){
            maxProfits[i] = max(prices[i] - lowPrice,maxProfits[i-1]);
            lowPrice = min(lowPrice,prices[i]);
        }
        int maxProfit = maxProfits[pricesSize-1],rightMaxProfit=0;
        int highPrice = prices[pricesSize-1];
        for(int i=pricesSize-2;i>=0;i--){
            rightMaxProfit = max(highPrice - prices[i],rightMaxProfit);
            maxProfit = max(maxProfit,max(maxProfits[i]+rightMaxProfit,maxProfits[i]));
            highPrice = max(highPrice,prices[i]);
        }
        return maxProfit;
    }
};

 

posted @ 2015-11-29 15:01  zengzy  阅读(181)  评论(0编辑  收藏  举报
levels of contents