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

题目:

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

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

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

示例:

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

思路:

动态规划
考虑三个状态,买入,卖出,不操作(包括冷冻期

买入利润的更新可以包括不操作,卖出利润的更新可以包括不操作。

建立两个动态数组,分别表示当天买入或者不操作的利润和当天卖出或者不操作的利润。

买入或者不操作的利润更新是看当天不操作的利润大还是买入的利润大,选择大的更新,如果当天不操作,利润就是前一次买入的利润,如果当天买入,那因为有冷冻期,所以前一天就不能卖出,卖出利润是前两天的,用这个利润减去当前价格,就是当天购入的收入。
卖出或者不操作的利润更新是看当天不操作的利润大还是卖出的利润大,选择大的更新,如果不操作,那利润就是上一次卖出的利润,如果卖出,利润就是上一次买入的利润加上这次卖出的价格。

遍历完毕,返回最大利润。

注意,写对两个动态数组索引0和1位置上的利润。

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        if len(prices) < 2:
            return 0
        buy = [0] * len(prices)
        sell = [0] * len(prices)
        buy[0] = -prices[0]
        buy[1] = max(-prices[1],buy[0])
        sell[0] = 0
        sell[1] = max(0,prices[1]-prices[0])
        for i in range(2,len(prices)):
            buy[i] = max(buy[i-1],sell[i-2]-prices[i])
            sell[i] = max(sell[i-1],buy[i-1]+prices[i])
        return max(sell[-1],buy[-1],0)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值