LeetCode - Best Time to Buy and Sell Stock III 题解

来源:互联网 发布:李逍遥到底爱谁知乎 编辑:程序博客网 时间:2024/06/07 03:29

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


思路:

想O(N)的算法,

F[i]表示,在第i天卖出一次最大利润(1次)

G[i]表示,在第i天买入,后面某天卖出最大利润(1次)

结合F和G的结果即可

class Solution {public:    int maxProfit(vector<int> &prices) {        vector<int> &A = prices;        int n = A.size();        if(n <= 1)return 0;        vector<int> F(n, 0), G(n, 0), K(n, 0);        F[0] = 0;        for(int i = 1; i < n; ++i){            F[i] = max(0, max(F[i - 1] - A[i - 1] + A[i], A[i] - A[i - 1]));           // cout << i << ':' << F[i] << endl;        }        //cout << endl;        G[n - 1] = 0;        for(int i = n - 2; i >= 0; --i){            G[i] = max(0, max(G[i + 1] + A[i + 1] - A[i], A[i + 1] - A[i]));            //cout << i << ':' << G[i] << endl;        }        //cout << endl;        K[n - 1] = G[n - 1];        for(int i = n - 2; i >= 0; --i){            K[i] = max(G[i], K[i + 1]);           // cout << i << ':' << K[i] << endl;        }        int ans = max(K[0], F[n - 1]);        for(int i = 0; i < n - 1; ++i){            ans = max(ans, F[i] + K[i + 1]);        }        return ans;    }};



0 0