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

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


题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown

题目


给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。​

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

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

示例:

输入: [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

解题思路


思路:动态规划

先审题,题目中说明,不能同时参与多笔交易,购买前需先抛售前面购买的股票。同时还会有一个冷冻期,题目给出的解释是当某一天抛售股票时,第二天无法再次购买也就是抛售后的第二天休息一天。

因为买卖有这个冷冻期的存在,我们先将是否持有股票区分开,再将这个概念添加进来讨论。先定义两个 dp 数组,分别代表持有股票和未持有股票的累计最大收益。

状态定义

先进行状态定义,定义两个数组分别为 ownnot_own。其中 own[i] 表示第 i 天时,持有股票的最大收益;而 not_own[i] 表示第 i 天时,未持有股票的最大收益。

状态转移

现在讨论 冷冻期 这个概念,上面两个数组,在进行状态转移的时候会有不同的情况,具体如下:

对于 own[i] 而言,表示第 i 天持有股票的最大收益,可能情况拆分如下:

  • i-1 天持有,第 i 天继续持有;
  • i-1 天为冷冻期,那么第 i 天买入(也就是前天卖了,当天买入价格为 prices[i]);
  • 那么此时的状态转移方程为:own[i] = max(own[i-1], not_own[i-2] - prices[i])

对于 not_own[i] 而言,也可以拆分为以下情况:

  • i-1 天抛售,第 i 天属于冷冻期;
  • i-1 天持有股票,第 i 天抛售股票;
  • 那么此时的状态转移方程为:not_own[i] = max(not_own[i-1], own[i-1]+prices[i])

在这里,两个数组之间发生状态转移。先说下 own[i] 的状态转移方程,对于第一种情况好理解,第二种情况,可以这样理解,因为相近一次买卖的收益是这样计算的:收益 = 卖出 - 买入。那么当天买入需要花的钱直接先扣除(也就是先减去买入价格),那么后续抛售的时候,这里就不再计算这一部分,直接加上卖出的价格。这种情况也就跟 not_own[i] 出现的第二种情况吻合,直接用前面第 i-1 天的收益加上当前股票的价格(因为前面已经先扣除过)。

初始化

own[0]:表示第 0 天买入,前面分析了,这里直接减去买入价格,所以 own[0] = -prices[0]

own[1]:表示可能第 0 天买入,第 1 天继续持有;或者第 1 天当天买入,所以 own[1] = max(-prices[0], -prices[1])

not_own[0]:表示第 0 天未持有股票,所以无收益,not_own[0] = 0

具体代码实现如下。

代码实现


class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        if not prices or len(prices) == 1:
            return 0

        length = len(prices)

        own = [0] * length
        not_own = [0] * length

        # 初始化
        own[0] = -prices[0]
        own[1] = max(-prices[0], -prices[1])

        not_own[0] = 0

        for i in range(1, length):
            not_own[i] = max(not_own[i-1], own[i-1] + prices[i])
            if i == 1:
                continue
            own[i] = max(own[i-1], not_own[i-2] - prices[i])
        
        return max(own[-1], not_own[-1])

实现结果


实现结果

欢迎关注


公众号 【书所集录

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,271评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,533评论 3 405
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,580评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,203评论 1 303
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,204评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,664评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,014评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,991评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,536评论 1 326
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,558评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,678评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,267评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,997评论 3 341
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,429评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,580评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,259评论 3 382
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,744评论 2 366