[Leetcode]Best Time to Buy and Sell Stock III

思路:III限制了只能進行兩次交易,問題可以轉化成在兩個不重疊區間找到i和j(i<j)可以使Aj - Ai,即在區間[0..i]和[i..n-1]兩個區間尋找最優的一次交易。時間複雜度是O(N^2),可以優化分別用O(N)的時間計算[0..i]和[i..n-1]。

class Solution {
public:
    int maxProfit(vector<int> &prices) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if(prices.size() < 2) return 0;
        vector<int> f(prices.size());
        vector<int> g(prices.size());
        int ans = 0;
        {
            int minVal = prices.front();
            int ans = 0;
            for(vector<int>::size_type i = 0; i < prices.size(); ++i)
            {
                minVal = min(minVal, prices[i]);
                ans = max(ans, prices[i] - minVal);
                f[i] = ans;
            }
        }
        {
            int maxVal = prices.back();
            int ans = 0;
            for(int i = prices.size() - 1; i >= 0; --i)
            {
                maxVal = max(maxVal, prices[i]);
                ans = max(ans, maxVal - prices[i]);
                g[i] = ans;
            }
        }
        ans = 0;
        for(int i = 0; i < prices.size(); ++i)
            ans = max(ans, f[i] + g[i]);
        return ans;
    }
};


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