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

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

题目描述

给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。

你可以无限次地完成交易,但是你每次交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。

返回获得利润的最大值。

示例1

输入:
prices = [1, 3, 2, 8, 4, 9], fee = 2
输出:
8
解释:
能够达到的最大利润:  
在此处买入 prices[0] = 1
在此处卖出 prices[3] = 8
在此处买入 prices[4] = 4
在此处卖出 prices[5] = 9
总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8.

提示

  • 0 < prices.length <= 50000.
  • 0 < prices[i] < 50000.
  • 0 <= fee < 50000.

题解

这是 【买卖股票的最佳时机】 系列题目的第五题。

这题其实就是在系列题目第二题基础上加了个手续费,也就是无限次买卖股票,但是每次卖的时候都得交一笔手续费。

这时候就不能和第二题一样,每次连续上升子区间都买卖一次了,因为如果买卖一次都不够交手续费的话,就不能进行买卖。或者一段连续下降子区间的差值小于手续费,那么就得把这段下降子区间也包含进去,前后只卖买一次。

所以我们换个思路,还是沿用第四题的动态规划思路。令  为第  只股票之前(包含)买卖(最后一次操作是买)可以获得的最大利润,  为第  只股票之前(包含)买卖(最后一次操作是卖)可以获得的最大利润。那么类似的有如下转移方程:

初始情况就是  和  。

此外这里还可以优化去掉一个维度,因为每个时刻状态只与前一个时刻有关。

时间复杂度是  。

代码

python

提示
0 < prices.length <= 50000.
0 < prices[i] < 50000.
0 <= fee < 50000.
题解
这是 【买卖股票的最佳时机】 系列题目的第五题。
这题其实就是在系列题目第二题基础上加了个手续费,也就是无限次买卖股票,但是每次卖的时候都得交一笔手续费。
这时候就不能和第二题一样,每次连续上升子区间都买卖一次了,因为如果买卖一次都不够交手续费的话,就不能进行买卖。或者一段连续下降子区间的差值小于手续费,那么就得把这段下降子区间也包含进去,前后只卖买一次。
所以我们换个思路,还是沿用第四题的动态规划思路。令  为第  只股票之前(包含)买卖(最后一次操作是买)可以获得的最大利润,  为第  只股票之前(包含)买卖(最后一次操作是卖)可以获得的最大利润。那么类似的有如下转移方程:
初始情况就是  和  。
此外这里还可以优化去掉一个维度,因为每个时刻状态只与前一个时刻有关。
时间复杂度是  。
代码
python
相关文章
|
1月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
39 0
|
17天前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
1月前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
27 2
|
3月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
52 6
|
3月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
50 1
|
3月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
61 1
|
3月前
|
算法
leetcode188 买卖股票的最佳时机IV
leetcode188 买卖股票的最佳时机IV
64 0
|
3月前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
80 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
118 2
下一篇
无影云桌面