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

2023-11-18

给定一个整数数组 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.

解答

这道题和基本的买卖股票 2唯一差异在于每次交易都需要支付手续费,所以需要减少交易次数,但是仍然可以延续此前贪心的策略。
首先考虑prices=[1, 4, 7], fee=2这样的例子,按照此前的贪心策略的话就是每一步都执行交易,收益为4-1-2+7-4-2=2,但考虑手续费的话应该只在直接在1处购入,7处卖出,此时收益为7-1-2=4,沿用贪心思路,我们依然可以选择只要当前价格比此前价格高就进行交易,但如果连续的两次交易发生在同一个价格处(上述例子的价格4),那显然可以减少一次交易,转换一下思路就是在该处售出股票后,将其价格相应减去fee,这样如果沿用贪心策略发生在售出处再次执行购入的话,就等价于减少了一次交易。

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        int result = 0;
        int pre = prices[0];
        for(int i = 0; i < prices.size(); i++){
            if(prices[i] < pre){
                pre = prices[i];
            }
            // 如果 pre 减去了 fee,那只要价格上升就可以交易
            // 如果 pre 没有减 fee,那必须要大于购入价格+fee则交易
            else if(prices[i] > (pre + fee)){
                result += (prices[i] - pre - fee);
                pre = prices[i] - fee;
            }
        }
        return result;
    }
};

同样可以采用动态规划,dp[i][0]表示i位置没有股票,dp[i][1]表示持有股票:

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        vector<vector<int>> dp(prices.size(), vector<int>(2, 0));
        dp[0][1] -= prices[0];
        for(int i = 1; i < prices.size(); i++){
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i] - fee);
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
        }
        return dp[prices.size() - 1][0];
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

714. 买卖股票的最佳时机含手续费 的相关文章

随机推荐

  • STM32串口中断接收方式详细比较

    本例程通过PC机的串口调试助手将数据发送至STM32 接收数据后将所接收的数据又发送至PC机 具体下面详谈 实例一 void USART1 IRQHandler u8 GetData u8 BackData if USART GetITSt
  • stata--异方差检验

    异方差检验有两种方法 1 残差图 2 white检验 1 残差图 一般不用这个 这个只是粗略 代码 reg y fdi rvfplot yline 0 rvpplot fdi yline 0 1 对y和fdi回归 2 画出残差与拟合值 y
  • Doc2Vec的简介及应用(gensim)

    作者 Gidi Shperber 在本文中 你将学习什么是doc2vec 它是如何构建的 它与word2vec有什么关系 你能用它做什么 并且没有复杂的数学公式 介绍 文本文档的量化表示在机器学习中是一项具有挑战性的任务 很多应用都需要将文
  • ajax实现文件上传

    没有使用插件 一 单文件上传
  • linux 命令:zip 详解

    zip 命令的功能是打包和压缩文件 用法 zip options b path t mmddyyyy n suffixes zipfile list xi list 如果 zipfile 未提供 压缩标准输入并把结果写到标准输出 选项 A
  • svn项目的拉取和提交

    svn项目的拉取和提交 如何拉取svn项目到本地 方法一 1 新建一个空的svn目录文件夹 然后直接在桌面空白处鼠标右击 点击Svn Checkout 弹出一个框 URL of repository就是该项目得svn地址 Checkout
  • R语言的Rattle可视化BI数据挖掘分析工具

    Rattle介绍 Rattle是一个免费的开源数据挖掘工具包 使用 Gnome 图形界面以统计语言 R编写 它在GNU Linux Macintosh OS X和MS Windows下运行 Rattle正在澳大利亚和国际上用于商业 政府 研
  • @Cacheable 设置缓存过期时间

    RedisCacheConfig 文件 Configuration public class RedisCacheConfig 自定义的缓存key的生成策略 若想使用这个key 只需要讲注解上keyGenerator的值设置为simpleK
  • 二叉树两节点的最短距离(一次dfs完成)

    字节面试问到的 leetcode上没看到 记录一下自己的做法 此题近似于leetcode 236 二叉树的最近公共祖先 但有较大不同 做法为 对二叉树进行dfs遍历 递归函数写法为func dfs root p q TreeNode ans
  • Kubernetes笔记(四):详解Namespace与资源限制ResourceQuota,LimitRange

    前面我们对K8s的基本组件与概念有了个大致的印象 并且基于K8s实现了一个初步的CI CD流程 但对里面涉及的各个对象 如Namespace Pod Deployment Service Ingress PVC等 及各对象的管理可能还缺乏深
  • 刷脸支付有效的风险监控和预防措施

    刷脸支付是运用了3D人脸识别 活体检测 大数据风控技术等高新技术的全新移动支付方式 将带领行业进入一次新的浪潮人脸图像的预处理主要包括人脸扶正 人脸图像的增强 以及归一化等工作 人脸扶正是为了得到人脸位置端正的人脸图像 图像增强是为了改善人
  • 【群智能算法】一种改进的北方苍鹰优化算法 改进北方苍鹰算法INGO[1]【Matlab代码#1】

    文章目录 获取资源 请见文章第5节 资源获取 1 基础北方苍鹰优化算法 1 1 猎物识别阶段 勘探阶段 1 2 追击和逃逸阶段 开发阶段 2 改进的北方苍鹰优化算法 2 1 立方混沌Cubic映射 2 2 透镜成像反向学习 2 3 最优最差
  • 刷脸支付横空问世便利了人们的生活

    刷脸支付的横空问世 极大的便利了用户的生活 即使没有手机 出门也不会受到阻碍 甚至在刷脸支付问世后 手机反而成了多余的摆设 无需携带任何东西便能出门 宛若武林中的大侠般 挥一挥衣袖 不带走任何云彩 潇洒出门 潇洒归来 刷脸支付的便利引得无数
  • BP神经网络多输入多输出预测,BP神经网络回归预测。

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 导入数据 res xlsread 数据 xlsx 数据分析 num size 0 8 训练集占数据集比例 ou
  • Python(有限差分法和杜普伊特假设)数值解非承压畜水层和堰底和板桩下稳定渗流

    达西定律描述了计算通过多孔介质的流量的基本方程 在三个垂直坐标方向 x y 和 z 上 可以用以下方式编写 q x K
  • Linux服务器大量log日志查看命令,快速定位错误

    针对大量log日志快速定位错误地方 tail f catalina ou 动态查看日志 cat catalina ou 从头打开日志文件 可以使用 gt nanjiangtest txt 输出某个新日志去查看 root yesky logs
  • MQ手动推送消息

    1 根据topic找到你发送问题的消息 记录tag标签 key值 message消息主体 2 找到手动发送消息的位置 输入相应信息 注意需要编辑tag为当前时间 转载于 https www cnblogs com bubutianshu p
  • Java:那些把自己陷进去的误区(一)

    那些把自己陷进去的误区 1 1数据类型 1 整型 1 在Java中 整形的范围为 2147 483 648 2147483647 并且这个范围与运行Java代码的机器无关 此举大大解决了移植问题 2 Java没有任何无符合的数据类型的 un
  • 我刚刚作出了一个非常艰难的决定,还是把这个贴子发出来

    中国电力总公司 我们刚刚作出了一个非常艰难的决定 在腾讯和360停止互相争斗之前 我们决定将在装有QQ软件和360软件的电脑上停止供电 中国电力有幸能陪伴着您成长 未来日子 我们期待与您继续同行 微软中国 我们刚刚作出了一个非常艰难的决定
  • 714. 买卖股票的最佳时机含手续费

    给定一个整数数组 prices 其中第 i 个元素代表了第 i 天的股票价格 非负整数 fee 代表了交易股票的手续费用 你可以无限次地完成交易 但是你每笔交易都需要付手续费 如果你已经购买了一个股票 在卖出它之前你就不能再继续购买股票了