方法:状态dp
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<vector<int>> dp(2, vector<int>(4, 0));
dp[0][0] -= prices[0];
for (int i = 1; i < n; ++i) {
dp[i&1][0] = max(max(dp[(i-1)&1][3], dp[(i-1)&1][1]) - prices[i], dp[(i-1)&1][0]);
dp[i&1][1] = max(dp[(i-1)&1][1], dp[(i-1)&1][3]);
dp[i&1][2] = dp[(i-1)&1][0] + prices[i];
dp[i&1][3] = dp[(i-1)&1][2];
}
return max(max(dp[(n-1)&1][3], dp[(n-1)&1][1]), dp[(n-1)&1][2]);
}
};
$时间复杂度O(n),空间复杂度O(1)
方法:贪心
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int res = 0, n = prices.size(), minv = prices[0];
for (int i = 1; i < n; ++i) {
if (minv > prices[i]) minv = prices[i];
if (prices[i] >= minv && prices[i] <= minv + fee) continue;
if (prices[i] > minv + fee) {
res += prices[i] - minv - fee;
minv = prices[i] - fee;
}
}
return res;
}
};
$时间复杂度O(n),空间复杂度O(1)
方法:状态dp
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int n = prices.size();
vector<vector<int>> dp(n, vector<int> (2, 0));
dp[0][0] -= 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] - fee);
}
return max(dp[n-1][1], dp[n-1][0]);
}
};
$时间复杂度O(n),空间复杂度O(n)