121. 买卖股票的最佳时机,easy
思路:
一次遍历,对于第 j 天,只要是在第 j 天之前股票价格最低的那天买进,就是对于 j 这一天可获得利润的最大值,所以在遍历中维护股票价格最低的那一天的信息就可以一次遍历得到最大值
class Solution {
public:
int maxProfit(vector<int>& prices) {
int minv=prices[0];//最低股票价格
int result=0;//可获得的最大利润
for(int i=0;i<prices.size();++i){
result=max(result,prices[i]-minv);//判断最大利润
minv=min(prices[i],minv);//维护最低价格
}
return result;
}
};
122. 买卖股票的最佳时机 II .easy
思路:根据题目,可以多次买卖股票,同时可以在今天把手头上的股票卖出的同时今天又买入,所以,只要在遍历时,prices[ i ] > prices[ i - 1 ] ,就可以获得利润。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int result=0;
for(int i=1;i<prices.size();++i){
result+=max(0,prices[i]-prices[i-1]);
}
return result;
}
};
309. 最佳买卖股票时机含冷冻期medium
对于每一天结束后的状态(也就是下一天开始时的状态)有三种:
- dp[0]:持有股票不在冷冻期
- dp[1]:不持有股票在冷冻期
- dp[2]:不持有股票不在冷冻期
每天的起始状态不同可以选的操作就不同
假设今天起始的状态为tmp[3]
那么对于今天结束后的状态
- dp[ 0 ] 可能是之前就持有了,也可能是今天才买的(也就是起始状态为tmp[ 2 ])
- 。。。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int dp[3]={-prices[0],0,0};//dp[0]:持有股票不在冷冻期;
//dp[1]:不持有股票在冷冻期;dp[2]:不持有股票不在冷冻期
int tmp[3]={0,0,0};
for(int i=1;i<prices.size();++i){
tmp[0]=dp[0];
tmp[1]=dp[1];
tmp[2]=dp[2];
dp[0]=max(tmp[2]-prices[i],tmp[0]);
dp[1]=tmp[0]+prices[i];
dp[2]=max(tmp[1],tmp[2]);
}
return max(dp[1],dp[2]);
}
};
714. 买卖股票的最佳时机含手续费 medium
延续上一题的思路
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int dp[2]={-prices[0],0};//这一天结束后的状态:
//dp[0]:手里有股票;dp[1]:手里没有股票
int tmp[2]={0,0};
for(int i=1;i<prices.size();++i){
tmp[0]=dp[0];
tmp[1]=dp[1];//存储这一天开始时的状态,也就是上一天结束时的状态
dp[0]=max(tmp[0],tmp[1]-prices[i]);//不可能有今天卖了再买,这样只会赔掉手续费
dp[1]=max(tmp[0]+prices[i]-fee,tmp[1]);
}
return dp[1];
}
};