D51|买卖股票Part3+总结篇

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

1.题目
给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

2.实现
还是被定义dp状态难住了~
一定要把握当前状态的意思,这样才明白和其他状态之间的转换, 如:
持有股票:在 持有股票 和 不持有再买入 中比较 (一定要保证还有股票)
今天买股票:今天一定会买股票,在 非持有 或 卖出中 进行状态转换

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        # 分清楚状态
        # 状态1:买入股票状态(持有股票且可以买股票),状态2:之前卖了股票 状态3:今天卖股票 状态4:冷冻期
        dp = [0] * 4
        dp[0] = - prices[0]
        for u in prices:
            dp[0], dp[1], dp[2], dp[3] = max(dp[0], max(dp[3] - u, dp[1] - u)), max(dp[1], dp[3]), dp[0] + u, dp[2]
        return max(dp[1], max(dp[2], dp[3]))

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

1.题目
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。
注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。

2.实现

class Solution:
    def maxProfit(self, prices: List[int], fee: int) -> int:
        # 状态1:今天买股票+手续费  状态2:之前买了股票 状态3:不持有股票(没操作或卖出)
        # 两个状态,只需在卖的时候减去手续费即可
        dp = [0] * 3
        dp[0] = -prices[0]-fee
        dp[1] = -prices[0]-fee
        for u in prices:
            dp[0], dp[1], dp[2] = dp[2] - u - fee, max(dp[1], dp[0]), max(dp[2], max(dp[0] + u , dp[1] + u))
        return dp[2]

买卖股票总结篇

1.买卖股票可能有贪心算法和简单的状态转移更新结果的方法,但常规方法还是动态规划;
2.在买卖股票的动态规划当中,需注意dp数组的定义,和根据定义写递推公式(见上题);
3.代码实现时,需注意用二维数组就是空间复杂度高,但清晰明了,用一维数组一定要写成同时更新的情况(见买卖股票Part2)

下面为买卖股票的类型
在这里插入图片描述

文章讲解

二刷补充:
1.该系列强推
121. 买卖股票的最佳时机
重点:dp定义,理解如何在一次买卖下dp的状态变化公式
122. 买卖股票的最佳时机 II
重点:有贪心动规两种方法,leetcode122和leetcode121的区别
(刷完这两道,股票系列搞定!)

2.在定义状态时,一定要结合状态定义来,如 当天卖出获得的最大利润 只能由 前一天的持有状态变为今日卖出,无需再保留原来的当天卖出利润最大状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值