*leetcode #123 in cpp

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

Solution:

Since we can make at most 2 transactions, we can divide the array into two parts, each part contains a transaction. Then we get maximum profit from left part, and maximum profit from right part. Then we have total profit = left profit + right profit. We want to maximize the total profit, and thus we should try every left part [0....i], i = 0,...,n, calculate the total profit and get the maximum total profit. 

Code:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.empty()) return 0;
        int n = prices.size();
        vector<int> leftProfit(n,0); //leftProfit[i] = max profit we can get from day 0 to day i. 
        vector<int> rightProfit(n,0);//rightProfit[i] = max profit we can get from day i to day n
        int profit = 0;
        int cost = prices[0];
        
        for(int i = 0; i < n; i ++){
            if(prices[i] >= cost ){
                profit = max(prices[i] - cost, profit);
            }else{
                cost = prices[i];
            }
            leftProfit[i] = profit; 
        }
        
        profit = 0;
        cost = prices[n-1];
        for(int i = n-1; i >=0; i --){
            if(prices[i] <= cost){
                profit = max(cost - prices[i], profit);
            }else{
                cost = prices[i];
            }
            rightProfit[i] = profit;
        }
        profit = 0;
        for(int i = 0; i < n; i ++){
            profit = max(profit, leftProfit[i]+rightProfit[i]);
        }
        return profit; 
        
    }
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章