今日任务
121. 买卖股票的最佳时机
- 题目链接: https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/
- 题目描述:
Code
class Solution {
public:
int maxProfit(vector<int>& prices) {
// dp[i][true] = max(dp[i - 1][true], - prices[i]);
// dp[i][false] = max(dp[i - 1][false], dp[i - 1][true] + prices[i]);
int f0 = 0, f1 = INT_MIN;
for(int t : prices){
int newf0 = max(f0, f1 + t);
f1 = max(f1, -t);
f0 = newf0;
}
return f0;
}
};
122.买卖股票的最佳时机II
- 题目链接: https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/
- 题目描述:
Code
class Solution {
public:
int maxProfit(vector<int>& prices) {
// int profit = 0;
// strong_ordering cmp_less = strong_ordering::less;
// strong_ordering cmp_greater = strong_ordering::greater;
// int buy = 0;
// bool is_buy = false;
// for(int i = 1; i < prices.size(); i++){
// if(!is_buy && prices[i - 1] <=> prices[i] == cmp_less){
// buy = prices[i - 1];
// is_buy = true;
// }else if(is_buy && prices[i - 1] <=> prices[i] == cmp_greater){
// profit += prices[i - 1] - buy;
// is_buy = false;
// }
// }
// if(is_buy && prices.back() > buy){
// profit += prices.back() - buy;
// }
// return profit;
// int ans = 0;
// int pre = 0;
// int n = prices.size();
// bool flag = false;
// for(int i = 1; i < n; i++){
// int a = prices[i - 1], b = prices[i];
// if(!flag && a < b){
// pre = a;
// flag = !flag;
// }else if(flag && a > b){
// ans += a - pre;
// flag = !flag;
// }
// }
// if(flag && prices.back() > pre){
// ans += prices.back() - pre;
// }
// return ans;
// 状态机DP
int n = prices.size();
// vector<array<int, 2>> memo(n, {-1, -1});
// function<int(int, bool)> dfs = [&](int i, bool hold)->int{
// if(i < 0){
// return hold ? INT_MIN : 0;
// }
// int & res = memo[i][hold];
// if(res != -1){
// return res;
// }
// if(hold){
// return res = max(dfs(i - 1, true), dfs(i - 1, false) - prices[i]);
// }
// return res = max(dfs(i - 1, false), dfs(i - 1, true) + prices[i]);
// };
// return dfs(n - 1, false);
// vector<array<int, 2>> f(n + 1);
// f[0][1] = INT_MIN; // 前一天不能操作
// for(int i = 0; i < n; i++){
// f[i + 1][0] = max(f[i][0], f[i][1] + prices[i]);
// f[i + 1][1] = max(f[i][1], f[i][0] - prices[i]);
// }
// return f[n][0];
int f0 = 0, f1 = INT_MIN;
for(int x : prices){
int newf0 = max(f0, f1 + x);
f1 = max(f1, f0 - x);
f0 = newf0;
}
return f0;
}
};
123.买卖股票的最佳时机III
- 题目链接: https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/description/
- 题目描述:
Code
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<array<int, 2>> dp(4, {INT_MIN / 2, INT_MIN / 2});
for(int j = 1; j <= 3; j++){
dp[j][0] = 0;
}
for(int x : prices){
for(int j = 3; j > 0; j--){
dp[j][0] = max(dp[j][0], dp[j - 1][1] + x);
dp[j][1] = max(dp[j][1], dp[j][0] - x);
}
}
return dp[3][0];
}
};