LeetCode刷题指南
第 0 章 hot100
0.1 哈希
0.2 双指针
0.3 滑动窗口
0.4 子串
0.5 普通数组
0.6 矩阵
0.7 链表
0.8 二叉树
0.9 图论
0.10 回溯
0.11 二分查找
0.12 栈
0.13 堆
0.14 贪心算法
0.15 动态规划
0.16 多维动态规划
0.17 技巧
第0-1章 面试经典150
0.1 数组/字符串
0.2 双指针
0.3 滑动窗口
链表
二叉树
第 1 章 最易懂的贪心算法
1.1 算法解释
1.2 分配问题
1.3 区间问题
1.4 练习
第 2 章 玩转双指针
2.1 算法解释
2.2 Two Sum
2.3 归并两个有序数组
2.4 滑动窗口
2.5 快慢指针
2.6 练习
第 3 章 居合斩!二分查找
3.1 算法解释
3.2 求开方
3.3 查找区间
3.4 查找峰值
3.5 旋转数组查找数字
3.6 练习
第 4 章 千奇百怪的排序算法
4.1 常用排序算法
4.2 快速选择
4.3 桶排序
4.4 练习
第 5 章 一切皆可搜索
5.1 算法解释
5.2 深度优先搜索
5.3 回溯法
5.4 广度优先搜索
5.5 练习
第 6 章 深入浅出动态规划
6.1 算法解释
6.2 基本动态规划:一维
6.3 基本动态规划:二维
6.4 分割类型题
6.5 子序列问题
6.6 背包问题
6.7 字符串编辑
6.8 股票交易
6.9 练习
第 7 章 化繁为简的分治法
7.1 算法解释
7.2 表达式问题
7.3 练习
第 8 章 巧解数学问题
8.1 引言
8.2 公倍数与公因数
8.3 质数
8.4 数字处理
8.5 随机与取样
8.6 练习
第 9 章 神奇的位运算
9.1 常用技巧
9.2 位运算基础问题
9.3 二进制特性
9.4 练习
第 10 章 妙用数据结构
10.1 C++ STL
10.2 Python 常用数据结构
10.3 数组
10.4 栈和队列
10.5 单调栈
10.6 优先队列
10.7 双端队列
10.8 哈希表
10.9 多重集合和映射
10.10 前缀和与积分图
10.11 练习
第 11 章 令人头大的字符串
11.1 引言
11.2 字符串比较
11.3 字符串理解
11.4 字符串匹配
11.5 练习
第 12 章 指针三剑客之一:链表
12.1 数据结构介绍
12.2 链表的基本操作
12.3 其它链表技巧
12.4 练习
第 13 章 指针三剑客之二:树
13.1 数据结构介绍
13.2 树的递归
13.3 层次遍历
13.4 前中后序遍历
13.5 二叉查找树
13.6 字典树
13.7 练习
第 14 章 指针三剑客之三:图
14.1 数据结构介绍
14.2 二分图
14.3 拓扑排序
14.4 练习
第 15 章 更加复杂的数据结构
15.1 引言
15.2 并查集
15.3 复合数据结构
15.4 练习
第16章 面试题
第 17 章 十大经典排序算法
README
本文档使用 MrDoc 发布
-
+
首页
6.8 股票交易
# 6.8 股票交易 `股票交易`类问题通常可以用动态规划来解决。对于稍微复杂一些的股票交易类问题,比如需要冷却时间或者交易费用,则可以用通过动态规划实现的`状态机`来解决。 ## [121. Best Time to Buy and Sell Stock](https://leetcode.com/problems/best-time-to-buy-and-sell-stock/) ### 题目描述 给定一段时间内每天某只股票的固定价格,已知你只可以买卖各一次,求最大的收益。 ### 输入输出样例 输入一个一维整数数组,表示每天的股票价格;输出一个整数,表示最大的收益。 ``` Input: [7,1,5,3,6,4] Output: 5 ``` 在这个样例中,最大的利润为在第二天价格为 1 时买入,在第五天价格为 6 时卖出。 ### 题解 我们可以遍历一遍数组,在每一个位置 i 时,记录 i 位置之前所有价格中的最低价格,然后将当前的价格作为售出价格,查看当前收益是不是最大收益即可。注意本题中以及之后题目中的buy 和 sell 表示买卖操作时,用户账户的收益。因此买时为负,卖时为正。 ```py def maxProfit(prices: List[int]) -> int: buy, sell = -sys.maxsize, 0 for price in prices: buy = max(buy, -price) sell = max(sell, buy + price) return sell ``` ## [188. Best Time to Buy and Sell Stock IV](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iv/) ### 题目描述 给定一段时间内每天某只股票的固定价格,已知你只可以买卖各 $$k$$ 次,且每次只能拥有一支股票,求最大的收益。 ### 输入输出样例 输入一个一维整数数组`prices`,表示每天的股票价格;以及一个整数$$k$$,表示可以买卖的次数 。输出一个整数,表示最大的收益。 ``` Input: [3,2,6,5,0,3], k = 2 Output: 7 ``` 在这个样例中,最大的利润为在第二天价格为 2 时买入,在第三天价格为 6 时卖出;再在第五天价格为 0 时买入,在第六天价格为 3 时卖出。 ### 题解 类似地,我们可以建立两个动态规划数组 buy 和 sell,对于每天的股票价格,buy 和sell,分别表示持有股票和不持有股票的最大利润 ```py class Solution: def maxProfit(self, k: int, prices: List[int]) -> int: n = len(prices) buy = [-inf] * (k + 1) sell = [0] * (k + 1) for i in range(n): for j in range(1, k + 1): buy[j] = max(buy[j], sell[j - 1] - prices[i]) sell[j] = max(sell[j], buy[j] + prices[i]) return sell[k] ``` ## [309. Best Time to Buy and Sell Stock with Cooldown](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/) ### 题目描述 给定一段时间内每天某只股票的固定价格,已知每次卖出之后必须冷却一天,且每次只能拥有一支股票,求最大的收益。 ### 输入输出样例 输入一个一维整数数组,表示每天的股票价格;输出一个整数,表示最大的收益。 ``` Input: [1,2,3,0,2] Output: 3 ``` 在这个样例中,最大的利润获取操作是买入、卖出、冷却、买入、卖出。 ### 题解 我们可以使用状态机来解决这类复杂的状态转移问题,通过建立多个状态以及它们的转移方式,我们可以很容易地推导出各个状态的转移方程。如图所示,我们可以建立四个状态来表示带有冷却的股票交易,以及它们的之间的转移方式。 buy, sell, s1, s2 是四个长度为 n 的数组,分别用于记录在每一天的四种状态下的最大利润: buy[i]:表示在第 i 天买入股票时的最大利润。 sell[i]:表示在第 i 天卖出股票时的最大利润。 s1[i]:表示在第 i 天持有股票时的最大利润。 s2[i]:表示在第 i 天不持有股票且不处于冷冻期时的最大利润。 ```py class Solution: def maxProfit(self, prices: List[int]) -> int: n = len(prices) buy, sell, s1, s2 = [0] *n, [0] *n, [0] *n, [0] *n # buy 买入, sell 卖出, s1 持有, s2 不持有且不冷却 s1[0] = buy[0] = -prices[0] sell[0] = s2[0] = 0 for i in range(1,n): buy[i] = s2[i-1] - prices[i] s1[i] = max(buy[i-1], s1[i-1]) sell[i] = max(buy[i-1], s1[i-1]) +prices[i] s2[i] = max(s2[i-1], sell[i-1]) return max(sell[n-1], s2[n-1]) ```
嘉心糖糖
2025年3月21日 14:45
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码