【LeetCode】每日一题

119 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第32天,点击查看活动详情

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

给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

「示例1:」
输入: prices = [1,2,3,0,2]
输出: 3 
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
「示例2:」
输入: prices = [1]
输出: 0
「提示:」
1. 1 <= prices.length <= 5000
2. 0 <= prices[i] <= 1000

解题思路

设dp[i][0]表示第i天交易完后无股票,dp[i][1]表示第i天交易完后有股票
则dp[i][0] 今天没股票,可能是
1/昨天也没股票dp[i-1][0] 2/昨天有股票,今天卖出了dp[i-1][1]+price[i]
则d[i][1] 今天有股票,可能是
1/昨天也有股票dp[i-1][1] 2/昨天没股票,昨天肯定为冷冻期,不然今天不可能买股票
所以i-2天做了卖出操作即 dp[i-2][0] - price[i] i-2天卖出 所以是[0],今天买了 -price[i]
所以第i天的最大收益为
dp[i][0] = Math.max( dp[i-1][0], dp[i-1][1]+price[i] )
dp[i][1] = Math.max( dp[i-1][1], dp[i-2][0] - price[i] )
最后一天的最大收益是肯定要卖出股票的
所以求第n天的话就是dp[n][0]的值
然后写初始条件
dp[0][0] = 0 第一天没股票为0
dp[0][1] = -prices[0] 第一天有股票为-prices[0]
dp[1][0] = Math.max(dp[0][0], dp[0][1]+price[1])
dp[1][1] = Math.max(dp[0][1], dp[0][0]-price[1])

代码实现

/**
 * @param {number[]} prices
 * @param {number} fee
 * @return {number}
 */
var maxProfit = function(prices) {
    if(prices.length<2)return 0
    let dp = Array.from(new Array(prices.length), () => new Array(2).fill(0));
    dp[0][0] = 0;
    dp[0][1] = -prices[0];
    dp[1][0] = Math.max(dp[0][0],dp[0][1]+prices[1]);
    dp[1][1] = Math.max(dp[0][1],dp[0][0]-prices[1]);
    for(let i = 2; i < prices.length; i++) {
        dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);
        dp[i][1] = Math.max(dp[i-1][1],dp[i-2][0]-prices[i]);
    }
    return dp[prices.length-1][0];
};

如果你对这道题目还有疑问的话,可以在评论区进行留言;