Algorithmusfrage Check-in Tag 49 – Aktienfrage | 121. Der beste Zeitpunkt, um Aktien zu kaufen und zu verkaufen, 122. Der beste Zeitpunkt, um Aktien zu kaufen und zu verkaufen II

121. Der beste Zeitpunkt zum Kauf und Verkauf von Aktien – LeetCode

Status: Greedy AC.

Veröffentlichen Sie zuerst den Code des gierigen Algorithmus:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int low = INT_MAX;
        int res = 0, len = prices.size();
        for(int i = 0; i < len; ++i){
            low = min(low, prices[i]);
            res = max(res, prices[i] - low);
        }
        return res;
    }
};

 Die Idee der dynamischen Programmierung spiegelt sich im Code wider:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len = prices.size();
        vector<vector<int>> dp(len, vector<int>(2, 0));
        //dp[i][0]表示第i天持有股票的最大收益,dp[i][1]表示不持有的最大收益
        dp[0][0] = -prices[0], dp[0][1] = 0;
        for(int i = 1; i < len; ++i){
            dp[i][0] = max(dp[i-1][0], -prices[i]);
            dp[i][1] = max(dp[i-1][1], dp[i-1][0]+prices[i]);
        }
        return dp[len-1][1];
    }
};

122. Der beste Zeitpunkt zum Kauf und Verkauf von Aktien II – LeetCode

Status: AC.

Der einzige Unterschied zur ersten Frage ist die Zustandsänderung von dp[i][0] in der Übertragungsgleichung, die die maximale Rendite des Haltens der Aktie am i-ten Tag darstellt. Da die erste Frage nur einmal gekauft werden kann, wenn Sie es am Vortag nicht gehalten haben. Wenn Sie es heute gehalten haben, muss es -prices[i] sein, aber diese Frage kann mehrmals bearbeitet werden. Wenn Sie es also am Vortag nicht gehalten haben, wenn Sie es heute gehalten haben, Es sollte dp[i-1][1]-Preise[i] sein. Code wie folgt anzeigen:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len = prices.size();
        vector<vector<int>> dp(len, vector<int>(2, 0));
        dp[0][0] = -prices[0], dp[0][1] = 0;
        for(int i = 1; i < len; ++i){
            dp[i][0] = max(dp[i-1][0], dp[i-1][1]-prices[i]);
            dp[i][1] = max(dp[i-1][1], dp[i-1][0]+prices[i]);
        }
        return dp[len-1][1];
    }
};

 

 

おすすめ

転載: blog.csdn.net/qq_40395888/article/details/132553475