[LeetCode] Best Time to Buy and Sell Stock III

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

 

Solution:

class Solution {
public:
    
int maxProfit(vector<int> &prices) {
        if(prices.size() < 2) return 0;
        int ans = 0;
        int day_num = prices.size();
        int *postMax = new int[day_num + 1], *postBest = new int[day_num + 1];//the max start from i, buy on the day i, the max profit
        postMax[day_num - 1] = 0;
        postBest[day_num - 1] = 0;
        for(int i = day_num - 2;i >= 0; i--)
        {
            postMax[i] = max(postMax[i + 1], prices[i + 1]);
            postBest[i] = max(postBest[i + 1], postMax[i] - prices[i]);
        }
        /*
        cout << "max: ";
        for(int i = 0;i < day_num;i++)
            cout << curMax[i] << " ";
        cout << endl;
        cout << "Best: ";
        for(int i = 0;i < day_num;i++)
            cout << curBest[i] << " ";
        cout << endl;
        */
        //two transactions, once the first sell out at day j, the next best choo        
        //sell on the day i, the best time to buy
        ans = postBest[0];
        int *preBest = new int[day_num + 1], *preMin = new int[day_num + 1];//the max profit of the first transaction.
        preBest[0] = 0;
        preMin[0] = prices[0];
        int tmpProfit = 0;
        for(int i = 1;i < day_num - 2;i++)
        {
            preBest[i] = max(preBest[i - 1], prices[i] - preMin[i - 1]);
            preMin[i] = min(preMin[i - 1], prices[i]);
            tmpProfit = preBest[i] + postBest[i + 1];
            //cout << "temp = " << tmpProfit << endl;
            if(tmpProfit > ans) ans = tmpProfit;
        }

        return ans;
    }
};
View Code
posted @ 2014-07-12 21:23  xchangcheng  阅读(187)  评论(0编辑  收藏  举报