一、题目描述

  • 给定一个整数数组 prices 和 整数 fee ,其中 prices[i] 表示第 i 天的股票价格,fee 代表了交易股票的手续费用。
  • 你可以无限次地完成交易,但是你每笔交易都需要付手续费。
  • 返回获得利润的最大值。
  • 注意:如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。

示例:

输入 输出 解释
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

提示:

  • 1<=num.length<=351 <= num.length <= 351<=num.length<=35
  • numnumnum 仅由数字(0 - 9)组成
  • 1<=prices.length<=5∗1041 <= prices.length <= 5 * 10^41<=prices.length<=5∗104
  • 1<=prices[i]<5∗1041 <= prices[i] < 5 * 10^41<=prices[i]<5∗104
  • 0<=fee<5∗1040 <= fee < 5 * 10^40<=fee<5∗104

二、求解思路:二维动态规划(含内存优化Python3代码)

  • 沿用 122 - 买卖股票的最佳时机 II 的二维动态规划思路, 在进行内存优化。
  • 做改进的地方就在于每次进行购买股票时,多减去 fee 即可。
  • 内存优化:每一天只有两种操作(买入或者卖出),理想情况是在最低点买入高点卖出,这时只要比较每天的这两种操作哪个获得的收益最大即可,此时只需要常数的内存,大大减少了内存且提高了运行效率。(文中采用贪心算法的思想给出了内存优化的Python3代码)

C++代码

class Solution {public:int maxProfit(vector<int>& prices, int fee) {int n = prices.size();int dp[n][2];dp[0][0] = 0; dp[0][1] = -prices[0] - fee;for(int i = 1; i < n; i++) {dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]);dp[i][1] = max(dp[i-1][0] - prices[i] - fee, dp[i-1][1]);}return dp[n-1][0];}
};


Python3代码

class Solution:def maxProfit(self, prices: List[int], fee: int) -> int:n = len(prices)dp = [ [[0],[0]] for i in range(n)]dp[0][0] = 0dp[0][1] = -prices[0] - feefor i in range(1,n):dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i])dp[i][1] = max(dp[i-1][0] - prices[i] - fee, dp[i-1][1])return dp[n-1][0]


内存优化:Python3代码

class Solution:def maxProfit(self, prices: List[int], fee: int) -> int:# 假设第一天买入operate = prices[0] + feeProfit = 0for price in prices:# 买高了,反悔,从更低位买入if price + fee < operate: operate = price + fee# 卖了,更新买入价elif price > operate: Profit += price - operateoperate = pricereturn Profit

Java代码

class Solution {public int maxProfit(int[] prices, int fee) {int n = prices.length;int[][] dp = new int[n][2];dp[0][0] = 0; dp[0][1] = -prices[0] - fee;for(int i = 1; i < n; i++) {dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] + prices[i]);dp[i][1] = Math.max(dp[i-1][0] - prices[i] - fee, dp[i-1][1]);}return dp[n-1][0];}
}


复杂度分析

  • 时间复杂度:O(n)O(n)O(n)。
  • 空间复杂度:O(n)O(n)O(n),内存优化后为O(1)O(1)O(1)。

三、参考文章

[1] https://blog.csdn.net/qq_40430360/article/details/124738846

[LeetCode刷题笔记]714 - 买卖股票的最佳时机含手续费(C++/Python3/Java/动态规划/贪心)相关推荐

  1. Leetcode刷题笔记 714. 买卖股票的最佳时机含手续费

    714. 买卖股票的最佳时机含手续费 时间:2020年12月17日 知识点:动态规划 题目链接:https://leetcode-cn.com/problems/best-time-to-buy-an ...

  2. 【LeetCode每日一题】——714.买卖股票的最佳时机含手续费

    文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[解题思路] 七[题目提示] 八[时间频度] 九[代码实现] 十[提交结果] 一[题目类别] 贪心算法 二[ ...

  3. 模拟卷Leetcode【普通】714. 买卖股票的最佳时机含手续费

    714. 买卖股票的最佳时机含手续费 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. 你可以无限次地完成交易,但是你每笔交易都 ...

  4. 《LeetCode刷题》—121. 买卖股票的最佳时机

    <LeetCode刷题>-121. 买卖股票的最佳时机 一.题目内容 原题连接:https://leetcode.cn/problems/best-time-to-buy-and-sell ...

  5. 力扣刷题day32|738单调递增的数字、714买卖股票的最佳时机含手续费、968监控二叉树

    文章目录 738. 单调递增的数字 思路 难点:遍历顺序 难点:设置flag 714. 买卖股票的最佳时机含手续费 贪心思路 难点 968. 监控二叉树 思路 难点:如何隔两个节点放一个摄像头 738 ...

  6. 力扣刷题day44|309最佳买卖股票时机含冷冻期、714买卖股票的最佳时机含手续费

    文章目录 309. 最佳买卖股票时机含冷冻期 思路 动态规划五部曲 714. 买卖股票的最佳时机含手续费 贪心思路 难点 动态规划思路 动态规划五部曲 309. 最佳买卖股票时机含冷冻期 力扣题目链接 ...

  7. 【算法】贪心算法:LeetCode 714 买卖股票的最佳时机含手续费 、LeetCode 968 监控二叉树

    LeetCode 714 买卖股票的最佳时机含手续费 (中等) 题目 描述 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. 你 ...

  8. 【贪心算法】Leetcode 714. 买卖股票的最佳时机含手续费

    [贪心算法]Leetcode 714. 买卖股票的最佳时机含手续费 题目 给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. ...

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

    714. 买卖股票的最佳时机含手续费 题目 思路 过一遍,记录第i天是否买入和卖出的最值. 代码 class Solution {public:int maxProfit(vector<int& ...

最新文章

  1. php 网站内容采集器 Snoopy
  2. JSP下Forward和Redirect的区别分析
  3. 电纸书kindle相关产品调研(没搞完)
  4. 解决:DuplicateMappingException: Table [xx] contains physical column name referred to by multiple ... .
  5. pythontime模块介绍_Python相关模块介绍
  6. mrpoid模拟器java版_mrpoid2冒泡模拟器下载-mrpoid2模拟器下载3.0安卓版-西西软件下载...
  7. 夜曲编程python_夜曲编程免费PC版-夜曲编程电脑版下载 v1.0.0--PC6电脑版
  8. 【解决】Win 10+Visual Studio community 2017,许可证到期,不能登录问题
  9. OSPF协议基本原理笔记
  10. j-style pro android,三星J7 Pro官方安卓9台湾版固件rom包:BRI-J730GMDXU6CSF5
  11. 回溯法经典算法 求集合中所有的子集
  12. 软考网络工程师备考详细介绍
  13. CSDN学霸课表——一切皆为 JavaScript
  14. 图片验证码显示不出来的问题
  15. 一个人靠不靠谱,就看这三件小事
  16. 2016年6月10号
  17. 系统更新荣耀play服务器,EMUI9.0系统不限量升级,荣耀Play“浴火重生”,你更新了吗?...
  18. python 下载百度贴吧图片
  19. jQuery和JS获取选中复选框的值
  20. 软件工程专业期末项目开发全流程模拟日志《需求规格说明文档》

热门文章

  1. 用java画一个小猪佩奇_python 画个小猪佩奇
  2. 不填写内容用哪个斜杠代替_【几月几日怎么写斜杠】作文写作问答 - 归教作文网...
  3. CT与DR双能X射线物质识别算法实现与应用(工业选煤、稀土分拣、毒爆检测、垃圾分类等)
  4. 微信公众号文章如何排版?
  5. 云服务基于DevCloud的自动化部署功能,实现快速部署网站应用
  6. AI医学诊断基础-CT扫描、核磁共振成像(MRI)、拍X光、拍胸片、做B超/彩超等常规检查的介绍、原理、医学影像示例(持续跟新和答疑。。。)
  7. 9.1-9.4 因特网与网络互连技术(上)
  8. pandas级联与合并
  9. 一加5应用未安装怎么解决_一加手机x安装不了软件下载是什么原因解决方法
  10. CSS学习笔记二:css 画立体图形