代码随想录训练营第四十一天 121买卖股票的最佳时机 122买卖股票的最佳时机II 123买卖股票的最佳时机III

第一题:

原题链接:121. 买卖股票的最佳时机 - 力扣(LeetCode)

思路:

首先定义dp数组为二维dp数组,

dp[i][0]表示第i天持有股票的最大现金

dp[i][1]表示第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]);

初始化:

dp[0][0]:持有股票那么为-price[0];

dp[0][1]:不持有股票那么就为0;

遍历顺序从前向后;

代码如下:

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

第二题:

原题链接:122. 买卖股票的最佳时机 II - 力扣(LeetCode)

思路:

和上一题的唯一区别就是递推公式中

            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]);

dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);这里股票能够买卖多次了,因此在持有的状态中可能之前就有利润了,那么第i天持有股票即dp[i][0],如果是第i天买入股票,所得现金就是昨天不持有股票的所得现金 减去 今天的股票价格 即:dp[i - 1][1] - prices[i]。

代码如下:

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

第三题:
原题链接:123. 买卖股票的最佳时机 III - 力扣(LeetCode)

思路:

定义五个状态;

dp[i][0]:表示不操作;

dp[i][1]:表示第一次持有股票的最大现金;

dp[i][2]:表示第一次不持有股票的最大现金;

dp[i][3]:表示第二次持有股票的最大现金;

dp[i][4]:表示第二次不持有股票的最大现金;

递推公式:

            dp[i][1] = max(dp[i - 1][1], -prices[i]);

            dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] + prices[i]);

            dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);

            dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);

初始化:

        dp[0][0] = 0;

        dp[0][1] = -prices[0];

        dp[0][2] = 0;

        dp[0][3] = -prices[0];

        dp[0][4] = 0;

代码如下:

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

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 02:18:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 02:18:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 02:18:02       58 阅读
  4. Python语言-面向对象

    2024-07-19 02:18:02       69 阅读

热门阅读

  1. ThreadPoolExecutor拒绝策略

    2024-07-19 02:18:02       24 阅读
  2. Redis 散列

    2024-07-19 02:18:02       18 阅读
  3. C# —— HashTable

    2024-07-19 02:18:02       21 阅读
  4. 4 Ajax

    2024-07-19 02:18:02       20 阅读
  5. GNU/Linux - U-BOOT的GPIO command

    2024-07-19 02:18:02       19 阅读
  6. 一篇文章帮你彻底搞懂剩余运算符!!

    2024-07-19 02:18:02       20 阅读
  7. selenium 之 css定位

    2024-07-19 02:18:02       21 阅读
  8. Elasticsearch SQL:解锁Elasticsearch数据的新方式

    2024-07-19 02:18:02       25 阅读
  9. 力扣第十二题——整数转罗马数字

    2024-07-19 02:18:02       22 阅读
  10. Qt 实战(6)事件 | 6.3、自定义事件

    2024-07-19 02:18:02       25 阅读
  11. 数据库(Database,简称DB)介绍

    2024-07-19 02:18:02       20 阅读
  12. x264、x265、libaom 编码对比实验

    2024-07-19 02:18:02       21 阅读