【LeetCode股票买卖系列:714. 买卖股票的最佳时机含手续费 | 暴力递归=>记忆化搜索=>动态规划】

news2024/9/23 11:22:51

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述

🍔 目录

    • 🚗 知识回顾
    • 🚩 题目链接
    • ⛲ 题目描述
    • 🌟 求解思路&实现代码&运行结果
      • ⚡ 暴力法
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
      • ⚡ 记忆化搜索
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
      • ⚡ 动态规划
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
    • 💬 共勉

🚗 知识回顾

大家在学习这道题目之前,可以先去看一下买卖股票最佳时机1,再看这个题目就更容易理解了。
博客的地址放到这里了,可以先去学习一下这到题目。

  • 【LeetCode股票买卖系列:121. 买卖股票的最佳时机 | 一次遍历 | 暴力递归=>记忆化搜索=>动态规划】
  • 【LeetCode股票买卖系列:122. 买卖股票的最佳时机 II | 贪心 | 暴力递归=>记忆化搜索=>动态规划】
  • 【LeetCode股票买卖系列:123. 买卖股票的最佳时机 III 暴力递归=>记忆化搜索=>动态规划】
  • 【LeetCode股票买卖系列:188. 买卖股票的最佳时机 IV | 暴力递归=>记忆化搜索=>动态规划】
  • 【LeetCode股票买卖系列:309. 最佳买卖股票时机含冷冻期 | 暴力递归=>记忆化搜索=>动态规划】

🚩 题目链接

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

⛲ 题目描述

给定一个整数数组 prices,其中 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
示例 2:

输入:prices = [1,3,7,5,10,3], fee = 3
输出:6

提示:

1 <= prices.length <= 5 * 104
1 <= prices[i] < 5 * 104
0 <= fee < 5 * 104

🌟 求解思路&实现代码&运行结果


⚡ 暴力法

🥦 求解思路

  1. 首先该题目核心求解思路我们之前也已经讲过了,不会的同学可以看一下之前的文章内容;
  2. 我们将这道题目区别于其它股票题目不同的内容标记出来,可以多次买卖 && 买卖一次股票需要fee费用;
  3. 第一个限制条件我们怎么去做,前面都已经讲过了,我们着重看一下第二个限制条件,第二个条件其实也比较简单,主要就是如果当前我们持有股票,并且答案是来自此时我们需要买入的时候,那么此时需要减去我们fee的费用。
  4. 接下来我们就来实现一下具体的代码。

🥦 实现代码

class Solution {
    int[] prices;
    int fee;
    public int maxProfit(int[] prices,int fee) {
        this.prices=prices;
        this.fee=fee;
        int n=prices.length;
        return process(n-1,0);
    }

    public int process(int i,int flag){
        if(i<0) return flag==1?Integer.MIN_VALUE:0;
        if(flag==1) return Math.max(process(i-1,1),process(i-1,0)-prices[i]-fee);
        return Math.max(process(i-1,0),process(i-1,1)+prices[i]);
    }
}

🥦 运行结果

果然不出我们所料,时间超限了,不要紧张,我们来继续优化它!

在这里插入图片描述


⚡ 记忆化搜索

🥦 求解思路

  1. 因为在递归的过程中,会重复的出现一些多次计算的结果,我们通过开辟一个数组,将结果提前缓存下来,算过的直接返回,避免重复计算,通过空间来去换我们的时间。

🥦 实现代码

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

    public int process(int i,int flag){
        if(i<0) return flag==1?Integer.MIN_VALUE:0;
        if(dp[i][flag]!=-1) return dp[i][flag];
        if(flag==1) return dp[i][flag]=Math.max(process(i-1,1),process(i-1,0)-prices[i]-fee);
        return dp[i][flag]=Math.max(process(i-1,0),process(i-1,1)+prices[i]);
    }
}

🥦 运行结果

加一个缓存表,通过!!!
在这里插入图片描述


⚡ 动态规划

🥦 求解思路

  1. 有了递归,有了记忆化搜索,接下来就是动态规划了,直接上手。

🥦 实现代码

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

🥦 运行结果

搞定,简直不要太爽!
在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/488713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vue 基础】尚品汇项目-07-动态展示三级联动数据

由于TypeNav是全局组件&#xff0c;因此将“src/pages/Home”中的“TypeNav”文件夹移动到“src/components”文件夹中 在main.js中修改TypeNav的路径 删除测试请求部分代码 当组件挂载完毕&#xff0c;可以向服务器发请求&#xff0c;然后获取数据&#xff0c;显示数据了。在“…

maven从入门到精通 第二章 Maven中运行Java与Web项目

这里写自定义目录标题 一 maven中运行Java项目1.新建项目2. 运行项目2.1查看当前目录2.2 编译项目2.3测试当前项目2.4 生成jar包2.5 迁移数据位置 二 MAVEN中执行Web项目1.配置项目1.1 配置 web.html1.2 配置index.jsp1.3 注册servlet1.4 直接编译运行&#xff0c;发现配置失败…

机器人工程学习和研究的结构性失衡

结论&#xff1a;无解&#xff0c;谁是那屈指可数的幸运者/(ㄒoㄒ)/~~ 供给&#xff1a;培养的机器人工程专业人才 需求&#xff1a;市场企业主体招聘的相关人才 不匹配&#xff0c;错配&#xff0c;导致供给无效。 机器人工程学习和研究的结构性失衡可能是由多种原因导致的…

Java学习-MySQL-备份

Java学习-MySQL-备份 为什么要备份&#xff1a; 1.保证重要的数据不丢失 2.数据转移 MySQL数据库备份的方式&#xff1a; 1.直接拷贝物理文件 2.在Sqlyog 这种可视化工具中导出 3.使用命令行导出&#xff0c;mysqldump&#xff0c;命令行使用 Sqlyog导出表 1.右键表 → 备…

智慧畜牧三维可视化,图扑数字孪生赋能现代农业

前言 "畜牧业是我国重要的农业产业之一&#xff0c;对于国民经济的发展和人民群众的生活具有重要的意义。智慧畜牧作为现代畜牧业的发展方向之一&#xff0c;将信息技术和现代管理相结合&#xff0c;提高养殖效率和品质&#xff0c;为行业的可持续发展注入新的动力。智慧…

PySpark基础入门(5):Spark 内核调度

目录 Spark 内核调度 DAG 内存迭代计算 Spark并行度 Spark任务调度流程 Spark 内核调度 Spark任务调度&#xff1a;如何组织任务去处理RDD中每个分区的数据&#xff0c;根据RDD的依赖关系构建DAG&#xff0c;基于DAG划分Stage&#xff0c;将每个Stage中的任务发到指定节…

盘点那些免费开源、无比精致的图标库,无论是设计还是开发,都很好用

之前分享过很多好看精致的图标库&#xff0c;这对日常设计和开发工作&#xff0c;都很方便&#xff0c;欢迎大家尝试。 css.gg 详细介绍&#xff1a;https://www.thosefree.com/css-gg 一套漂亮的纯 CSS 实现的免费开源图标库&#xff0c;700多个时尚漂亮的 css 图标库&…

本地开发项目删除原有git信息,上传到自己的git仓库

1. 删除原有git信息 进入到项目的目录&#xff0c;右键&#xff0c;选择 git Bash Here 输入 rm -rf .git 查看当前的远程信息&#xff1a;git remote -v 如果有远程信息 使用 git remote rm origin 删除 2.添加自己的远程信息 使用 git remote add origin https://xxxx.git…

分布式事务 --- Seata事务模式、高可用

一、事务模式 1.1、XA模式 XA 规范 是 X/Open 组织定义的分布式事务处理&#xff08;DTP&#xff0c;Distributed Transaction Processing&#xff09;标准&#xff0c;XA 规范 描述了全局的TM与局部的RM之间的接口&#xff0c;几乎所有主流的数据库都对 XA 规范 提供了支持。…

三种常用的以太网端口链路类型:Access、Hybrid和Trunk

以太网是计算机网络中最常用的协议之一&#xff0c;它允许计算机在同一局域网上通信。在以太网中&#xff0c;交换机&#xff08;Switch&#xff09;是一个重要的组件&#xff0c;它们有许多不同的端口&#xff0c;用于连接不同的设备。为了管理和维护这些端口&#xff0c;有三…

Java 数组在内存中的结构是怎样的?数组访问、遍历、复制、扩容、缩容如何编写代码?

Java是一门面向对象的编程语言&#xff0c;数组是其中的重要数据结构之一。在Java中&#xff0c;数组是一种固定长度、有序的数据结构&#xff0c;可以存储一组相同数据类型的元素。在本文中&#xff0c;我们将详细介绍Java数组在内存中的结构。 Java数组的定义 在Java中&…

美国访问学者博士后签证过期后应如何更新?

“美国访问学者类J签证过期后应如何更新&#xff1f;”有读者希望知识人网分享相关经验。今天我们来简单介绍下美国签证免面谈代传递服务&#xff0c;以及其申请条件和相关流程&#xff0c;希望能对大家有所帮助。 首先我们需要明确两个概念&#xff1a; DS2019表的有效期&…

第一章(四):Django框架的模板(DTL):变量、标签、模板过滤器、模板继承、配置模板文件(staticfiles)

系列文章目录 备注&#xff1a;这里是Django系列文章的所有文章的目录 第一章(一) : Django框架如何创建项目、创建应用、创建templates&#xff1b;如何启动django项目&#xff1b; 第一章(二)&#xff1a;Django框架的模式、路由、视图&#xff1b; 第一章(三)&#xff1a;D…

copilot平替tabnine解析

1.copilot 借着最近chatgpt大火的东风&#xff0c;copilot又重新火了一把。 什么是copilot&#xff1f;直接上wiki百科上的解释 GitHub Copilot是GitHub和OpenAI合作开发的一个人工智能工具&#xff0c;用户在使用Visual Studio Code、Microsoft Visual Studio、Vim、Cursor或…

Flask使用Flask-SQLAlchemy对数据库操作详解二(配置、表与表之间一对一、多对一、多对多关系及增删改查参数和代码详细总结)

前面接&#xff1a;Flask使用Flask-SQLAlchemy对数据库操作详解二&#xff08;配置、表与表之间一对一、多对一、多对多关系及增删改查参数和代码详细总结&#xff09; 文章目录 4.增删改查操作4.1添加1. 使用add()方法添加新数据2. 使用create()方法创建新数据 4.2 查询数据1.…

ADAS/AD笔记之特斯拉Autopilot-HW3.0系统

摘要&#xff1a; 目前国内一般直接将高速NOA成为“L2”&#xff1b;因此&#xff0c;复杂度更高的城区NOA&#xff0c;就自然的映射到了“L2”。 一、概述&#xff1a; 特斯拉Autopilot系统首创了NOA这种淡化脱手/脱眼/脱脑&#xff08;驾驶自动化程度&#xff09;逻辑的功能…

电脑系统怎么选?Win?MacOS?Linux?

马上要学编程了&#xff0c;我们要学什么操作系统呢&#xff1f;是MacOS&#xff0c;还是Windows&#xff0c;或者是Linux或者其他&#xff01;那我们今天就来说说MacOS系统和Windows系统的优缺点&#xff0c;也介绍一下其他的系统。让你心里有底&#xff01; 1、Windows 首先当…

OpenShift 4 - 在 CI/CD Pipeline 中创建 KubeVirt 容器虚拟机 - 方法3

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在支持 OpenShift 4.12 的 OpenShift 环境中验证 文章目录 创建并运行 CI/CD Pipeline访问 VMPipeline 的 Task 解读 创建并运行 CI/CD Pipeline 执行命令&#xff0c;生成公钥-私钥对。 $ ssh-keygen$ l…

贪心法——最小生成树

问题描述&#xff1a; 最小生成树Time Limit: 2000 MSMemory Limit: 5000 KB Description 给定n(n<500)个顶点,以及E(E<20000)条边&#xff0c;计算最小生成树的权值.Input 第一行输入T表示有T组数据。每组数据第一行输入n、E&#xff0c;分别表示顶点数和边数. 接下…

2023年度国家自然科学基金项目申请初审结果公布~

2023年4月28日&#xff0c;国家自然科学基金委员会发布了《关于公布2023年度国家自然科学基金项目申请初审结果的通告》&#xff0c;2023年度国家自然科学基金项目申请初审结果公布&#xff01;2023年度项目申请集中接收期间&#xff0c;自然科学基金委共接收各类型项目申请304…