算法刷题记录 Day44
Date: 2024.04.11
lc 714. 买卖股票,含手续费
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int n = prices.size();
// 相当于每卖一次,获得股票价格-手续费的现金。
// 两种状态:已买,已卖;
int buy = -prices[0];
int sell = 0;
for(int i=1; i<n; i++){
int cur_sell = max(sell, buy + prices[i] - fee);
int cur_buy = max(buy, sell - prices[i]);
sell = cur_sell;
buy = cur_buy;
}
if(sell > 0) return sell;
else return 0;
}
};
lc 309. 买卖股票,含冷冻期
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
// 当前可能有三种状态:已买入,已卖出但冷冻期,已卖出且已出冷冻期(等价未买入);
// dp[i] 表示三种状态下的现金。可以用三个变量表示。
int buy = -prices[0]; // 已买入
int sell_no = 0; // 已卖出,冷冻期
int sell_yes = 0; // 已卖出,已出冷冻期,可再买
for(int i=1; i<n; i++){
// 注意,得到的今天状态都需要由昨天的状态计算得到,因此需要另存三个变量;
int cur_sell_yes = max(sell_yes, sell_no);
int cur_sell_no = buy + prices[i];
int cur_buy = max(buy, sell_yes - prices[i]);
sell_yes = cur_sell_yes;
sell_no = cur_sell_no; //注意,sell_no必须从buy状态转来,而不能集成前一天
buy = cur_buy;
}
if(sell_yes < 0) return 0;
else return max(sell_no, sell_yes);
}
};