122. 买卖股票的最佳时机 II
题目
思路描述
-
问题定义:
- 给定一个整数数组
prices
,其中prices[i]
表示第i
天的股票价格。 - 每天可以选择买入、卖出或不操作,但最多只能持有 1 股股票。
- 目标是计算可以获得的最大利润。
- 给定一个整数数组
-
状态定义:
dp[i][0]
表示第i
天不持有股票时的最大利润。dp[i][1]
表示第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])
:持有股票时,可以选择前一天就持有股票,或者前一天不持有股票并在今天买入。
-
边界条件:
dp[0][0] = 0
:第一天不持有股票的最大利润为 0。dp[0][1] = -prices[0]
:第一天持有股票的最大利润为-prices[0]
。
-
最终结果:
- 最终结果是
dp[n-1][0]
,即最后一天不持有股票时的最大利润。
- 最终结果是
注意事项
-
边界条件处理:
- 如果
prices
为空,直接返回 0。
- 如果
-
变量初始化:
- 初始化
dp
数组,dp[0][0] = 0
和dp[0][1] = -prices[0]
。
- 初始化
-
循环控制:
- 循环从 1 开始到
n-1
,确保覆盖所有可能的天数。
- 循环从 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] = 0
和dp[0][1] = -prices[0]
。 - 状态转移:对于每一天,计算不持有股票和持有股票时的最大利润,并更新
dp
数组。 - 最终结果:
dp[n-1][0]
即为所求的最大利润。 - 最后一天:在最后一天时手里不能留有股票。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理