一个函数解决【LeetCode 买卖股票的最佳时机】系列所有题目!

简介: 一个函数解决【LeetCode 买卖股票的最佳时机】系列所有题目!

题目和题解汇总

之前介绍了【LeetCode 买卖股票的最佳时机】系列一共六道题目,这里把之前的题解还有题目链接汇总一下,方便大家查找。

第一题

LeetCode 121. 买卖股票的最佳时机[1]

每日算法系列【LeetCode 121】买卖股票的最佳时机

第二题

LeetCode 122. 买卖股票的最佳时机 II[2]

每日算法系列【LeetCode 122】买卖股票的最佳时机 II

第三题

LeetCode 123. 买卖股票的最佳时机 III[3]

每日算法系列【LeetCode 123】买卖股票的最佳时机 III

第四题

LeetCode 188. 买卖股票的最佳时机 IV[4]

每日算法系列【LeetCode 188】买卖股票的最佳时机 IV

第五题

LeetCode 714. 买卖股票的最佳时机含手续费[5]

每日算法系列【LeetCode 714】买卖股票的最佳时机含手续费

第六题

LeetCode 309. 最佳买卖股票时机含冷冻期[6]

每日算法系列【LeetCode 309】最佳买卖股票时机含冷冻期

通用解法

上面六道题目中,前四题限制了买卖的次数,第五题加入了手续费,第六题加入了冻结时间。所以我们提出一般性的问题:

给定每天的价格 ,最大买卖次数 ,手续费 ,冻结时间 ,求最大利润。

观察前面六题的代码,我们可以在第四题基础上进行修改,这样代码量比较小。

首先是增加手续费,这个很简单,只需要在  更新时减去一个手续费  就行了。

有点麻烦的是冻结时间。在第六题代码中,增加了一个维度用来保存每一只股票之前(包含)的最大利润,目的是为了获取相隔一个冻结时间之前的股票以前可以获得的最大利润。但是通用情况下不能这么保存,不然的话空间复杂度就变成了  ,极限情况下会爆掉。

解决方法就是,因为对于第  只股票来说,只需要访问它与  之间的数值,那么我们只需要保存  大小的数组就行了。在访问的时候,采用取模的方法,来让数组滚动起来。

还有一些细节,比如如果 ,那么问题就退化为了没有买卖次数限制,也就是第五题和第六题的情况。如果不这样处理的话,按照上面方法做,时间复杂度和空间复杂度都是  ,可能会吃不消。

代码

通用函数

class Solution:
    def solve(self, prices, k=1, fee=0, freeze=0):
        n = len(prices)
        if n == 0 or k == 0: return 0
        limit = 0 if k >= n//2 else 1
        k = 1 if k >= n//2 else k
        dp0 = [-prices[0]] * (k+1)
        dp1 = [[0]*(k+1) for _ in range(freeze+1)]
        for i in range(1, n):
            for j in range(1, k+1):
                dp0[j] = max(dp0[j], dp1[i%(freeze+1)][j-1 if limit else j]-prices[i])
                dp1[i%(freeze+1)][j] = max(dp1[(i-1)%(freeze+1)][j], dp0[j]+prices[i]-fee)
        return max(dp1[(n-1)%(freeze+1)][k], 0)

第一题

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        return self.solve(prices, k=1, fee=0, freeze=0)

第二题

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        return self.solve(prices, k=len(prices), fee=0, freeze=0)

第三题

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        return self.solve(prices, k=2, fee=0, freeze=0)

第四题

class Solution:
    def maxProfit(self, k: int, prices: List[int]) -> int:
        return self.solve(prices, k, fee=0, freeze=0)

第五题

class Solution:
    def maxProfit(self, prices: List[int], fee: int) -> int:
        return self.solve(prices, len(prices), fee, 0)

第六题

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        return self.solve(prices, k=len(prices), fee=0, freeze=1)
相关文章
|
3月前
|
算法 Python
【Leetcode刷题Python】309. 最佳买卖股票时机含冷冻期
解决LeetCode上309题“最佳买卖股票时机含冷冻期”的Python代码示例,利用动态规划方法计算在含有冷冻期约束下的最大利润。
40 1
|
28天前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
|
2月前
|
SQL Oracle 关系型数据库
CASE WHEN 语句的语法及示例,LeetCode 题目 “确认率” 练习
本文介绍了SQL中CASE语句的两种形式和语法,并通过LeetCode题目“确认率”的SQL查询示例展示了CASE语句在实际问题中的应用,解释了如何使用CASE语句计算特定条件的比率。
|
3月前
|
算法
LeetCode第12题目整数转罗马数字
该文章介绍了 LeetCode 第 12 题整数转罗马数字的解法,通过使用 TreeMap 按照整数从大到小排序,先使用大的罗马数字表示整数,再用小的,核心是先表示完大的罗马数字,想通此点该题较简单。
LeetCode第12题目整数转罗马数字
|
3月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
50 6
|
3月前
|
算法 Python
【Leetcode刷题Python】121. 买卖股票的最佳时机
解决LeetCode上121题“买卖股票的最佳时机”的Python代码示例,采用一次遍历的方式寻找最佳买卖时机以获得最大利润。
59 1
|
3月前
|
算法
leetcode188 买卖股票的最佳时机IV
leetcode188 买卖股票的最佳时机IV
61 0
|
3月前
|
算法
LeetCode第13题目罗马数字转整数
该文章介绍了 LeetCode 第 13 题罗马数字转整数的解法,通过从大到小解析罗马数字,根据罗马数字的特点,按照从大到小的顺序匹配罗马数字和整数的关系,从而解决该问题,同时强调要注意观察题目考查的知识点特征。
|
3月前
|
算法 Python
【Leetcode刷题Python】714. 买卖股票的最佳时机含手续费
提供了两种解决买卖股票最佳时机含手续费问题的Python实现方法:贪心算法和动态规划算法。
41 0