买卖股票的最佳时期
买卖股票的最佳时期2
买卖股票的最佳时期3
买卖股票的最佳时期4
最佳买卖股票时机含冷冻期
int maxProfit(vector<int>& prices) {
int n = prices.size();
//初始化状态:
int pro = 0;//第0天的最大利润
int minn = prices[0];//第0天的历史最低价格
//从第一天开始,i表示天
for(int i = 1 ; i < n ; i++){
pro = max(prices[i]-minn, pro);//第i天的最大利润,有可能还是第i-1天的最大利润,也有可能是第i天的价格减去历史最低价格,此时minn的值为[0,i-1]天中的最低价格
minn = min(minn, prices[i]);//更新最低价格,此时minn为[0,i]天中的最低价格
}
return pro;
}
int maxProfit(vector<int>& prices) {
int n = prices.size();
//dp[i][0]为当天未持有股票的利润
//dp[i][1]为当天持有一只股票的利润
vector<vector<int>> dp(n, vector<int>(2,0));//dp[i]表示第i天的利润
//初始化
dp[0][0] = 0;
dp[0][1] = -prices[0];
for(int i = 1; i < n; i++){
//第i天未持有股票,可能是前一天也未持有,也有可能是今天刚卖
dp[i][0] = max(dp[i-1][0], dp[i-1][1]+prices[i]);
//第i天持有股票,可能是前一天也持有,也有可能是今天刚买
dp[i][1] = max(dp[i-1][1], dp[i-1][0]-prices[i]);
}
return max(dp[n-1][0],dp[n-1][1]);
}
int maxProfit(vector<int>& prices) {
int n = prices.size();
int buy1 = -prices[0], sell1 = 0, buy2 = -prices[0], sell2 = 0;
for(int i = 1; i < n; i++){
buy1 = max(buy1, -prices[i]);
sell1 = max(sell1, buy1+prices[i]);
buy2 = max(buy2, sell1-prices[i]);
sell2 = max(sell2, buy2+prices[i]);
}
return sell2;
}
int maxProfit(int k, vector<int>& prices) {
int n = prices.size();
if( n <= 1)
return 0;
k = min(k, n/2);
vector<int> buy(k+1, -10001);
vector<int> sell(k+1, -10001);
buy[0] = -prices[0];
sell[0] = 0;
for(int i = 1; i < n; i++){
buy[0] = max(buy[0], sell[0]-prices[i]);
for(int j = 1; j <= k; j++){
buy[j] = max(buy[j], sell[j]-prices[i]);
sell[j] = max(sell[j], buy[j-1]+prices[i]);
}
}
return *max_element(sell.begin(),sell.end());
}
int maxProfit(vector<int>& prices) {
//假设每天交易时间为晚上9点
int n = prices.size();
if(n == 0)
return 0;
vector<vector<int>> dp(n, vector<int>(3,0));//n表示为第几天9点01秒
dp[0][0] = -prices[0]; //第0天9:01 秒持有股票
dp[0][1] = 0; //第0天9:01 不持有股票且今天结束冷冻期
dp[0][2] = 0; //第0天9:01 不持有股票且不处于冷冻期
//循环:天数
for(int j = 1; j < n; j++){
dp[j][0] = max(dp[j-1][0], dp[j-1][2]-prices[j]);//持有股票,可能是刚买入,也有可能昨天也持有
dp[j][1] = dp[j-1][0]+prices[j];//处于冷冻期了,今天肯定卖了
dp[j][2] = max(dp[j-1][2], dp[j-1][1]);//不处于冷冻期,可能是冷冻期刚过,或者昨天也不是冷冻期
}
return max(max(dp[n-1][0],dp[n-1][1]),dp[n-1][2]);
}