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

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

本题加了一个冷冻期,状态就多了,有点难度,大家要把各个状态分清,思路才能清晰
DAY51|309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费、总结_第1张图片

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]);
    }
}

你可能感兴趣的:(算法,动态规划,leetcode)