思路分析:
- 使用动态规划的思想,创建一个二维数组
dp
来存储每一天结束时的各种状态下的最大利润。 - 初始条件:第0天结束时,分别设置不持有股票、持有股票(第一次买入)、不持有股票(第一次卖出)、持有股票(第二次买入)、不持有股票(第二次卖出)的利润。
- 通过循环遍历每一天的股价,更新
dp
数组中的值。 - 对于每一天,根据不同的交易状态,计算并更新对应的最大利润。
- 最终返回最后一天结束时第二次卖出后的最大利润,即
dp[prices.size()-1][4]
。
class Solution {
public:
// 函数用于计算最大利润
int maxProfit(vector<int>& prices) {
// 创建一个二维数组dp,其中dp[i][j]表示第i天结束时的最大利润,j的取值范围为0到4
vector<vector<int>> dp(prices.size() + 1, vector<int>(5, 0));
// 初始条件:第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], dp[i - 1][0] - 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[prices.size()-1][4]
return dp[prices.size() - 1][4];
}
};