代码随想录训练营二刷第五十三天 | 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

代码随想录训练营二刷第五十三天 | 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

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

题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/
思路:本题包含了冷静期,比之前会复杂一些,定义dp[i]有四种状态:
①、持有状态:分为之前持有、今天才持有。
②、不持有状态(非今天不持有):分为两天之前才卖出前一天是冷静期的不持有状态、在这之后一直不持有的状态。
③、今天才不持有状态
④、冷静期状态:冷静期只有一天,不可持续。

故有如下代码,之所以要提前保存持有和当天不持有的值,因为不能进行当天买当天卖的操作,dp[2]表示当天不持有,必须得前一天是持有状态,就得用上一次的值。
dp[3]表示今天是冷静期,必须前一天就得是刚卖出的状态。
int t1 = dp[0];
int t2 = dp[2];
dp[0] = Math.max(dp[0], Math.max(dp[1], dp[3]) - prices[i]);
dp[1] = Math.max(dp[1], dp[3]);
dp[2] = t1 + prices[i];
dp[3] = t2;
这里说一下之前的题目为什么不需要进行保存,之前是
dp[0]=math.max(dp[0], dp[1]-nums[i]);
dp[1]=math.max(dp[1],dp[0]+nums[i]);
这里的dp[1]使用的dp[0]有两种可能性的值,一种是前一天买的,一种是今天的买的,包含今天买的也无所谓,不过是今天买今天卖没影响。

class Solution {
   public int maxProfit(int[] prices) {
        int[] dp = new int[4];
        dp[0] = -prices[0];
        // 四种状态:持有、(前两天不持有和好多天不持有)、今天不持有、今天冷静期(因为冷静期只有一天没有持续状态)
        for (int i = 1; i < prices.length; i++) {
            int t1 = dp[0];
            int t2 = dp[2];
            dp[0] = Math.max(dp[0], Math.max(dp[1], dp[3]) - prices[i]);
            dp[1] = Math.max(dp[1], dp[3]);
            dp[2] = t1 + prices[i];
            dp[3] = t2;
        }
        return Math.max(Math.max(dp[1], dp[2]), dp[3]);
    }
}

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

题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/
思路:和之前一样,多一个减手续费

class Solution {
    public int maxProfit(int[] prices, int fee) {
        int[] dp = new int[2];
        dp[0] = -prices[0];
        for (int i = 1; i < prices.length; i++) {
            dp[0] = Math.max(dp[0], dp[1]-prices[i]);
            dp[1] = Math.max(dp[1], dp[0]+prices[i]-fee);
        }
        return dp[1];
    }
}

你可能感兴趣的:(力扣算法题,算法,数据结构,java)