Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >一个函数解决【LeetCode 买卖股票的最佳时机】系列所有题目!

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

作者头像
lucifer210
发布于 2020-02-27 07:49:12
发布于 2020-02-27 07:49:12
78500
代码可运行
举报
文章被收录于专栏:脑洞前端脑洞前端
运行总次数:0
代码可运行

题目和题解汇总

之前介绍了【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】最佳买卖股票时机含冷冻期

通用解法

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

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

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

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

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

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

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

代码

通用函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

第一题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        return self.solve(prices, k=1, fee=0, freeze=0)

第二题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        return self.solve(prices, k=len(prices), fee=0, freeze=0)

第三题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        return self.solve(prices, k=2, fee=0, freeze=0)

第四题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def maxProfit(self, k: int, prices: List[int]) -> int:
        return self.solve(prices, k, fee=0, freeze=0)

第五题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def maxProfit(self, prices: List[int], fee: int) -> int:
        return self.solve(prices, len(prices), fee, 0)

第六题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        return self.solve(prices, k=len(prices), fee=0, freeze=1)

参考资料

[1]

LeetCode 121. 买卖股票的最佳时机: https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/

[2]

LeetCode 122. 买卖股票的最佳时机 II: https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/

[3]

LeetCode 123. 买卖股票的最佳时机 III: https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii/

[4]

LeetCode 188. 买卖股票的最佳时机 IV: https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv/

[5]

LeetCode 714. 买卖股票的最佳时机含手续费: https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/

[6]

LeetCode 309. 买卖股票的最佳时机: https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 脑洞前端 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
每日算法系列【LeetCode 714】买卖股票的最佳时机含手续费
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。
godweiyang
2020/03/24
4960
LeetCode 714. 买卖股票的最佳时机含手续费(DP)
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。
Michael阿明
2020/07/13
4860
LeetCode 714. 买卖股票的最佳时机含手续费(DP)
LeetCode 122. 买卖股票的最佳时机 II
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
Michael阿明
2022/11/26
4130
LeetCode 122. 买卖股票的最佳时机 II
动态规划:买卖股票的最佳时机含手续费
题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/
代码随想录
2021/03/16
4620
LeetCode 121. 买卖股票的最佳时机
如果你最多只允许完成一笔交易(即买入和卖出一支股票), 设计一个算法来计算你所能获取的最大利润。
Michael阿明
2022/11/26
4110
LeetCode 121. 买卖股票的最佳时机
leetcode 每日一题:714. 买卖股票的最佳时机含手续费
leetcode 每日一题:714. 买卖股票的最佳时机含手续费:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/
用户7685359
2020/12/22
2770
股票问题-LeetCode #121、122、309、714、123、188(一解6杀,状态转移)
dp初始化: dp[-1][k][0] = dp[i][0][0] = 0 dp[-1][k][1] = dp[i][0][1] = -infinity
算法工程师之路
2019/11/26
4910
动态规划 —— dp 问题-买卖股票的最佳时机含手续费
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/description/
迷迭所归处
2024/11/19
710
动态规划 —— dp 问题-买卖股票的最佳时机含手续费
[LeetCode]动态规划,一举歼灭“股票买卖的最佳时机”问题
在[LeetCode]买卖股票的最佳时机ⅠⅡ中,Jungle采用波峰波谷法解决了两道简单题。那么剩余4到题目该如何求解呢?
用户6557940
2022/07/24
4470
[LeetCode]动态规划,一举歼灭“股票买卖的最佳时机”问题
[LeetCode]买卖股票的最佳时机ⅠⅡ
2020年元旦后,股市小涨了一波,Jungle趁此机会,开始思考LeetCode上的股票买卖时机的问题。
用户6557940
2022/07/24
2610
[LeetCode]买卖股票的最佳时机ⅠⅡ
九十三、动态规划系列之股票问题(下)
股票买卖这一类的问题,都是给一个输入数组,里面的每个元素表示的是每天的股价,并且你只能持有一支股票(也就是你必须在再次购买前出售掉之前的股票),一般来说有下面几种问法:
润森
2022/08/17
3770
团灭 LeetCode 股票买卖问题
很多读者抱怨 LeetCode 的股票系列问题奇技淫巧太多,如果面试真的遇到这类问题,基本不会想到那些巧妙的办法,怎么办?所以本文拒绝奇技淫巧,而是稳扎稳打,只用一种通用方法解决所用问题,以不变应万变。
labuladong
2021/12/09
5860
团灭 LeetCode 股票买卖问题
leetcode每日一题:714. 买卖股票的最佳时机含手续费
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/
用户3578099
2020/12/30
5280
leetcode: explore-array-22 买卖股票的最佳时机 II
leetcode explore 初级算法第二题:买卖股票的最佳时机 II。这个系列目前一共有5道题目:
用户7685359
2020/08/24
3740
leetcode: explore-array-22 买卖股票的最佳时机 II
每日算法系列【LeetCode 309】最佳买卖股票时机含冷冻期
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
godweiyang
2020/03/24
3940
LeetCode 188. 买卖股票的最佳时机 IV(动态规划)(递归)
给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 示例 1: 输入:k = 2, prices = [2,4,1] 输出:2 解释:在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。
SakuraTears
2022/01/13
3920
贪心算法:买卖股票的最佳时机含手续费
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。
代码随想录
2020/12/31
7860
【题目】买卖股票的最佳时机
原文地址: https://copyfuture.com/blogs-details/2020011113393672457wxpb9gxgbqzvf
谙忆
2021/01/21
2630
​LeetCode刷题实战121:买卖股票的最佳时机
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock
程序员小猿
2021/01/19
2750
​LeetCode刷题实战121:买卖股票的最佳时机
【前端算法】买卖股票的最佳时机含手续费—— 贪心算法、动态规划实现
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。
徐小夕
2022/02/09
3350
推荐阅读
相关推荐
每日算法系列【LeetCode 714】买卖股票的最佳时机含手续费
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验