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

题目

思路描述

  1. 问题定义

    • 给定一个整数数组 prices,其中 prices[i] 表示第 i 天的股票价格。
    • 每天可以选择买入、卖出或不操作,但最多只能持有 1 股股票。
    • 目标是计算可以获得的最大利润。
  2. 状态定义

    • dp[i][0] 表示第 i 天不持有股票时的最大利润。
    • dp[i][1] 表示第 i 天持有股票时的最大利润。
  3. 状态转移方程

    • 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]):持有股票时,可以选择前一天就持有股票,或者前一天不持有股票并在今天买入。
  4. 边界条件

    • dp[0][0] = 0:第一天不持有股票的最大利润为 0。
    • dp[0][1] = -prices[0]:第一天持有股票的最大利润为 -prices[0]
  5. 最终结果

    • 最终结果是 dp[n-1][0],即最后一天不持有股票时的最大利润。

注意事项

  1. 边界条件处理

    • 如果 prices 为空,直接返回 0。
  2. 变量初始化

    • 初始化 dp 数组,dp[0][0] = 0dp[0][1] = -prices[0]
  3. 循环控制

    • 循环从 1 开始到 n-1,确保覆盖所有可能的天数。

代码实现

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if (prices.empty()) return 0;

        int n = prices.size();
        vector<vector<int>> dp(n, vector<int>(2, 0));
        dp[0][0] = 0;
        dp[0][1] = -prices[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-1][0] - prices[i]);
        }

        return dp[n-1][0];
    }
};

解释

  • 初始化dp[0][0] = 0dp[0][1] = -prices[0]
  • 状态转移:对于每一天,计算不持有股票和持有股票时的最大利润,并更新 dp 数组。
  • 最终结果dp[n-1][0] 即为所求的最大利润。
  • 最后一天:在最后一天时手里不能留有股票。
posted @   zh&wy  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示