D50|买卖股票Part2

123.买卖股票的最佳时机III

1.题目
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

2.实现
想到要区分第一次交易和第二次交易,但是没有增加状态而仅仅是单独考虑了两个dp数组,所以不清楚怎么讲两个dp数组联系起来
思路提示:增加状态,从持有和未持有增加考虑进第一次买卖和第二次买卖

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        #用5种状态来记录操作股票情况,分别为没有操作,第一次买入,第一次卖出,第二次买入,第二次卖出
        dp = [0] * 5
        dp[1] = -prices[0]
        dp[3] = -prices[0]
        for u in prices:
            # dp[0]无需操作
            dp[1] = max(dp[1], -u)
            dp[2] = max(dp[2], dp[1] + u)
            dp[3] = max(dp[3], dp[2] - u)
            dp[4] = max(dp[4], dp[3] + u)
        return dp[4]

188.买卖股票的最佳时机IV

1.题目
给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

2.实现
基于上一题,这题就轻松多了~

class Solution:
    def maxProfit(self, k: int, prices: List[int]) -> int:
        length = 2 * k + 1
        dp = [0] * length
        for i in range(1, length, 2):
            dp[i] = -prices[0]
        for u in prices:
            for i in range(1, length):
                if i % 2 != 0: # 第i次买入
                    dp[i] = max(dp[i], dp[i - 1] - u)
                else:
                    dp[i] = max(dp[i], dp[i - 1] + u)
        return dp[length - 1]

文章讲解

写在后面
上面采用的一维数组,相对dp[i]中小于i的数组都进行了更新,这样理解比较困难,虽然可以ac,但是不建议这么写,可以利用Python等号赋值特点:
dp[0], dp[1] = equal1, equal2
或者建立二维数组进行更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值