Bootstrap

【代码随想录day41】【C++复健】121. 买卖股票的最佳时机;122.买卖股票的最佳时机II ;123. 买卖股票的最佳时机 III

要问我这几天人去哪了~ 自然是——炒股去了!事实证明,会写股票问题的代码和会炒股完全是两码子事,还是安心当码农吧。

121. 买卖股票的最佳时机

本题因为感觉不用设置两个状态,只要记录下最小值和最大值就能得出答案,但也因为这个和后面的方法没对齐,所以可以看看我的思路,如果自己做的话还是按卡哥的方法去写会更好一些,这样和后面的方法相比较起来也更连贯。

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

122.买卖股票的最佳时机II

之前贪心做过一遍本题,现在再做一遍dp,因为股票问题也算是一个初见杀问题,只要搞定初始化和递推设置,写起来并不难,所以本题做的也是挺顺利的。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        vector<vector<int>> dp(n, vector<int>(2));
        dp[0][0] = -prices[0];
        dp[0][1] = 0;
        for(int i=1; i<n; 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][0] + prices[i]);
        }
        return dp[n-1][1];
    }

123. 买卖股票的最佳时机 III

本题相对来说上了点强度,不过对于二周目的我来说依旧是顷刻炼化,毫无难度。

只要大致知道应该设置出4个状态,以及初始化的时候把买的那两次设置为-prices[0],别的就都没什么好说了。

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

;