121. 买卖股票的最佳时机
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/
class Solution {
public:
int maxProfit(vector<int>& prices) {
if (prices.size() == 1) return 0;
int result = 0;
int dp = prices[0];
for (int i = 1; i < prices.size(); i++) {
result = max(result, prices[i] - dp);
dp = min(prices[i], dp);
}
return result;
}
};
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<vector<int>> dp(2, vector<int>(2, 0));
//dp[0][0] 前一天未持有股票状态的最大利润
//dp[1][1] 当天持有股票状态的最大利润
dp[0][0] = 0;
dp[0][1] = -prices[0];
for (int i = 1; i < prices.size(); i++) {
//如果当天未持有股票,可能是前一天就没有股票,也可能今天把持有的股票卖掉了
dp[1][0] = max(dp[0][0], dp[0][1] + prices[i]);
dp[0][0] = dp[1][0];
//如果持有股票,可能是当天买的,也可能前一天就已经持有了
dp[1][1] = max(dp[0][1], -prices[i]);
dp[0][1] = dp[1][1];
}
return dp.back()[0];
}
};
122.买卖股票的最佳时机II
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/
class Solution {
public:
int maxProfit(vector<int>& prices) {
int result = 0;
for (int i = 1; i < prices.size(); i++) {
if (prices[i] > prices[i - 1]) result += prices[i] - prices[i - 1];
}
return result;
}
};
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<vector<int>> dp(2, vector<int>(2, 0));
//dp[0][i] 前一天
//dp[1][i] 当天
//dp[i][0] 未持有
//dp[i][1] 持有
dp[0][0] = 0;
dp[0][1] = -prices[0];
for (int i = 1; i < prices.size(); i++) {
//如果第i天未持有,可能是昨天持有今天卖了,也可能是昨天就未持有
dp[1][0] = max(dp[0][0], dp[0][1] + prices[i]);
//如果第i天持有,可能是昨天就持有,也可能是昨天未持有今天买了
dp[1][1] = max(dp[0][1], dp[0][0] - prices[i]);
dp[0][0] = dp[1][0];
dp[0][1] = dp[1][1];
}
return dp.back()[0];
}
};