leetcode: Best Time to Buy and Sell Stock III

来源:互联网 发布:阿里妈妈淘宝客赚钱 编辑:程序博客网 时间:2024/06/07 17:17

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


先用dp[i]表示当前下标之前最低价格,再把dp[i]变成当前下标前最大利润,其实这可以一次循环做完;  O(n)

然后从后遍历prices如果i到n-1的最大利润加dp[i]大于(相当于两次交易)结果,更新结果max_sum;O(n)

总的时间复杂度O(n)

class Solution {public:    int maxProfit(vector<int> &prices) {        if( prices.size() < 2)            return 0;        vector< int> dp( prices.size(), INT_MIN);        dp[0] = prices[0];        for( int i = 1; i < prices.size(); ++i){            dp[i] = min( dp[i-1], prices[i]);        }        for( int i = 0; i < dp.size(); ++i){            dp[i] = prices[i] - dp[i];        }        int max_sum = dp[dp.size()-1];//两次交易最大的和        int high_price = prices[prices.size()-1];//i到n-1最大价格        int max_part = 0;//i到n-1最大利润        for( int i = prices.size() - 2; i >= 0; --i){            int tmp_max_part = high_price - prices[i];//临时i到n-1最大利润            max_part = max_part > tmp_max_part ? max_part : tmp_max_part;            int tmp_max_sum = max_part + dp[i];//临时两次交易最大的和            max_sum = max_sum > tmp_max_sum ? max_sum : tmp_max_sum;            high_price = high_price > prices[i] ? high_price : prices[i];//更新i到n-1最大价格        }        return max_sum;    }};


0 0