代码随想录算法训练营第四十九天 | 121.买卖股票的最佳时机、122.买卖股票的最佳时机II

文章目录

  • 一、121.买卖股票的最佳时机
  • 二、122.买卖股票的最佳时机II


一、121.买卖股票的最佳时机

题目链接

代码如下:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len = prices.size();
        if (len == 0) return 0;
        vector<vector<int>> dp(len, vector<int> (2)); // dp[i][0]表示第i天持有股票获得的最多现金,dp[i][1]表示第i天不持有股票获得的最多现金
        dp[0][0] = -prices[0];
        dp[0][1] = 0;
        for (int i = 1; i < len; i++) {
            // max(第i天之前就持有的现金=第i-1天就持有的现金,第i天花费prices[i]买股票的钱,因为只能买卖一次,所以手头的现金是0,0-prices[i])
            dp[i][0] = max(dp[i - 1][0], - prices[i]); 
            // max(第i天之前就不持有的现金=第i-1天就不持有的现金,第i天不持有的现金=第i-1天持有股票的现金+卖出股票所得的钱prices[i])
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
        }
        return dp[len - 1][1]; // 不持有股票一定比持有股票拥有的现金多
    }
};

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

题目链接

与I唯一的区别在于手中的钱不再是0,而是前几次买卖得到的利润: dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);

代码如下:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len = prices.size();
        if (len == 0) return 0;
        vector<vector<int>> dp(len, vector<int>(2)); // 0持有,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], dp[i - 1][1] - prices[i]); // 可以买卖多次了,手中的现金不再是只能买卖一次时候的0,而是在i之前买卖多次获得的利润,即在i-1天持有股票获得的现金(昨天不持有股票获得的现金-今天股票的价格)
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
        }
        return dp[len - 1][1];
    }
};

你可能感兴趣的:(算法)