DAY51|309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费、总结

309.最佳买卖股票时机含冷冻期

本题加了一个冷冻期,状态就多了,有点难度,大家要把各个状态分清,思路才能清晰
在这里插入图片描述

class Solution {
    public int maxProfit(int[] prices) {
        // 状态一:达到持有股票状态(今天买入股票;或者是之前就买入了股票没有操作,一直持有)
        // 不持有股票状态,这里就有两种卖出股票状态
        // 状态二:保持卖出股票的状态(两天前就卖出了股票,度过一天冷冻期;或者是前一天就是卖出股票状态,一直没操作)
        // 状态三:今天卖出股票
        // 状态四:今天为冷冻期状态,但冷冻期状态不可持续,只有一天!
        int daylen=prices.length;
        int[][] dp=new int[daylen][4];
        dp[0][0]=-prices[0];
        for(int i=1;i<daylen;i++){
            //持有股票 (分析空的情况(因为空才需要买))前一天是冷冻期证明刚买过今天可以买;前一天不是冷冻期(因为至少分出两个状态是冷冻期和不是冷冻期,但是前一天也不可以是卖出状态,因为第二天肯定是冷冻期,于是这个状态可以理解为已经过了冷冻期但是一直没有买入)但是没有股票于是今天也可以买
            dp[i][0]=Math.max(dp[i-1][0],Math.max(dp[i-1][3]-prices[i],dp[i-1][1]-prices[i]));
            //不是冷冻期但是也没有股票的状态可以由:本身状态保持得来,也可以由前一天是冷冻期得来,但是不会是从持有股票变成不持有股票,因为
            dp[i][1]=Math.max(dp[i-1][1],dp[i-1][3]);
            dp[i][2]=dp[i-1][0]+prices[i];
            //冷冻状态一定由前一天是卖出状态才能得来
            dp[i][3]=dp[i-1][2];
            
        }
        return Math.max(dp[daylen-1][1],Math.max(dp[daylen-1][2],dp[daylen-1][3]));
    }
}

714.买卖股票的最佳时机含手续费

相对122.买卖股票的最佳时机II ,本题只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的,可以尝试自己做一做。

class Solution {
    public int maxProfit(int[] prices, int fee) {
        int daylen=prices.length;
        int[][] dp=new int[daylen][2];
        dp[0][1]=-prices[0];
        for(int i=1;i<daylen;i++){
            //买入
            dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]-prices[i]);
        //卖出
            dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i]-fee);

        }
        
        return Math.max(dp[daylen-1][1],dp[daylen-1][0]);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值