我曾用贪心算法写过这题,并且这题而言贪心算法比动态规划更好更高效。
思路分析:
- 使用动态规划的思想,创建一个二维数组
dp
来存储每一天结束时持有和不持有股票的最大利润。 - 初始条件:第0天结束时,持有股票的利润为0-prices[0],不持有股票的利润为0。
- 通过循环遍历每一天的股价,更新
dp
数组中的值。 - 对于每一天,分别计算持有和不持有股票的最大利润,取其中较大的值更新
dp
数组。 - 最终返回最后一天结束时不持有股票的最大利润,即
dp[prices.size()-1][1]
。
class Solution {
public:
// 函数用于计算最大利润
int maxProfit(vector<int>& prices) {
// 创建一个二维数组dp,其中dp[i][j]表示第i天结束时的最大利润,j为0表示持有股票,j为1表示不持有股票
vector<vector<int>> dp(prices.size() + 1, vector<int>(2, 0));
// 初始条件:第0天结束时,持有股票的利润为0-prices[0],不持有股票的利润为0
dp[0][0] = 0 - prices[0];
dp[0][1] = 0;
// 循环遍历每一天的股价
for (int i = 1; i < prices.size(); i++) {
// 计算第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[prices.size()-1][1]
return dp[prices.size() - 1][1];
}
};