leetcode 20200630 六道股票问题

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

这道题用买卖两次 那么就整出一二次买卖 四种状态

  1. 买卖股票的最佳时机 IV
    这道题首先要考虑这个k次是否可以实现 也就是数组个数小于2k否
    然后再看使用上述的状态转移公式来决定如何变换

  2. 最佳买卖股票时机含冷冻期
    这道含有冷冻期就是说卖出的第二天不能交易
    所以状态转移方程发生了一点点变化
    就是说
    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;
}

};
  1. 买卖股票的最佳时机含手续费
    含有手续费 其实就是通用的状态转移公式 只是加上了一个手续费而已
    这个问题就解决了
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值