121.买卖股票的最佳时机
这道题维持一个最小值的记录 假如小于它 就更换最小值 假如不小于 可以去更换差值
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len=prices.size();
if(len==0 ||len==1){return 0;}
int zuixiao=INT_MAX;
int res=0;
for(int i=0;i<len;i++){
if(prices[i]<zuixiao){
zuixiao=prices[i];
}
else if(prices[i]-zuixiao>res){
res=prices[i]-zuixiao;
}
}
return res;
}
};
122.买卖股票的最佳时机
这道题有一个策略就是说 如果在中间某一天卖出 再同一天买入 只要进出的天数固定 收益就是一样的
那么 这样的话我们就可以使用贪心算法 只要有收益就可以操作 加上去
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len=prices.size();
int res=0;
for(int i=1;i<len;i++){
if(prices[i]>prices[i-1]){
res+=prices[i]-prices[i-1];
}
}
return res;
}
};
123.买卖股票的最佳时机III
因为这道题的话 只允许买卖两次 没办法用贪心了 所以只能使用动态规划
有一个 团灭6道股票问题的方法
用动态规划
使用dp[i][k][0/1]表示状态(第i天,最多能交易几次,是否持有股票)。
那么
dp[i][k][0]=max(dp[i-1][k][0],dp[i-1][k][1]+price[i])
1
表示前一天没有持有股票,或者持有股票但是卖了
dp[i][k][1]=max(dp[i-1][k][1],dp[i-1][k-1][0]-price[i])
1
表示前一天持有股票,或者没有持有股票但是买了
————————————————
版权声明:本文为CSDN博主「Zolewit」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Zolewit/article/details/94721917
https://blog.csdn.net/Zolewit/article/details/94721917
这道题用买卖两次 那么就整出一二次买卖 四种状态
-
买卖股票的最佳时机 IV
这道题首先要考虑这个k次是否可以实现 也就是数组个数小于2k否
然后再看使用上述的状态转移公式来决定如何变换 -
最佳买卖股票时机含冷冻期
这道含有冷冻期就是说卖出的第二天不能交易
所以状态转移方程发生了一点点变化
就是说
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+price[i])
dp[i][1]=max(dp[i-1][1],dp[i-2][0]-price[i])
class Solution {
public:
int maxProfit(vector<int>& prices) {
int dp0 = 0, dp1 = INT_MIN;
int dp0_pre = 0;
for(int i=0;i<prices.size();++i){
int tmp = dp0;
dp0 = max(dp0,dp1+prices[i]);
dp1 = max(dp1,dp0_pre-prices[i]);
dp0_pre = tmp;
}
return dp0;
}
};
- 买卖股票的最佳时机含手续费
含有手续费 其实就是通用的状态转移公式 只是加上了一个手续费而已
这个问题就解决了
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int len=prices.size();
if(len==0){return 0;}
int dp0=0;
int dp1=INT_MIN;
for(int i=0;i<len;i++){
dp0=max(dp0,dp1+prices[i]);
dp1=max(dp1,dp0-prices[i]-fee);
}
return dp0;
}
};
最后附上链接 一个通用算法团灭六股票问题
https://blog.csdn.net/Zolewit/article/details/94721917