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