【LeetCode股票买卖系列:123. 买卖股票的最佳时机 III 暴力递归=>记忆化搜索=>动态规划】

2023-05-16

在这里插入图片描述

🚀 算法题 🚀

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

🚀 算法题 🚀

在这里插入图片描述

🍔 目录

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

🚗 知识回顾

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

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

🚩 题目链接

  • 123. 买卖股票的最佳时机 III

⛲ 题目描述

给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

输入:prices = [3,3,5,0,0,3,1,4]
输出:6
解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。
随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3 。

示例 2:

输入:prices = [1,2,3,4,5]
输出:4
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

示例 3:

输入:prices = [7,6,4,3,1]
输出:0
解释:在这个情况下, 没有交易完成, 所以最大利润为 0。

示例 4:

输入:prices = [1]
输出:0

提示:

1 <= prices.length <= 105
0 <= prices[i] <= 105

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


⚡ 暴力法

🥦 求解思路

  1. 该题目区别于之前学习的那俩道股票题目,不同的是该题目买卖的次数给我们限制为最多不超过俩次。那么核心的思路都是一样的,不一样的地方在于,我们再添加一个限制条件就可以了,该限制条件用来表示最多不能超过俩次。
  2. 之前的思路+这道题目的限制,接下来我们就来实现一下具体的代码。

🥦 实现代码

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

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

🥦 运行结果

时间超限了,不要紧张,我们来继续优化它!

在这里插入图片描述


⚡ 记忆化搜索

🥦 求解思路

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

🥦 实现代码

class Solution {
    
    private int[][][] dp;

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

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

🥦 运行结果

我们发现,通过加一个缓存表,还是超限,那我们就继续优化。
在这里插入图片描述


⚡ 动态规划

🥦 求解思路

  1. 有了递归,有了记忆化搜索,接下来就是动态规划了,直接上手。
  2. 此处需要额外注意的是我们在递归和记忆化搜索的时候limit是卖股票,在售出的时候减1,那么动态规划,递推的过程是则相反。

🥦 实现代码

class Solution {
    
    private int[][][] dp;

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

🥦 运行结果

搞定!
在这里插入图片描述


💬 共勉

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

在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【LeetCode股票买卖系列:123. 买卖股票的最佳时机 III 暴力递归=>记忆化搜索=>动态规划】 的相关文章

  • ROS学习(22)TF变换

    文章目录 前言一 TF功能包二 TF工具1 tf monitor2 tf echo3 static transform publisher4 view frames 三 乌龟例程中的TF四 乌龟跟随例程代码实现1 创建TF广播器2 创建TF
  • C# winform 窗体缩放问题处理

    一 问题 xff1a 本身窗体在设计器显示没有问题 xff0c 但运行时窗口却被缩放失真 xff1a 二 解决方法 xff1a 修改项目的配置文件 xff0c 使项目运行时自动检测屏幕分辨率 xff0c 在高分辨率屏幕禁用系统缩放 xff0
  • strlen与sizeof计算char* 与char数组

    sizeof 可以计算所有类型 xff0c strlen 仅计算字符串 xff0c 至于这二者的详细区别可以看其他文章 char a char b 5 sizeof a 61 8 64位系统 xff0c 8代表的是指针的大小 xff0c 指
  • MySQL的not null default

    建表语句每行末尾的NOT NULL DEFAUTL 含义 该句的含义是 xff0c 该字段不能为null xff0c 并且设置如果插入数据的时候不设置该字段的值的时候使用的默认值 insert操作且不给该字段插值的时候 xff0c 数据库判
  • eclipse 中 中文字符变小的解决方法

    前言 xff1a 装了新版的eclipse后发现 英文代码部分正常 xff0c 但是但凡有中文的地方中文字符变小了 xff0c 若调整字体大小 xff0c 英文就更大了 xff0c 总归中英文大小不一致 推荐解决方法 xff1a 打开 ec
  • LINUX/AIX下文本DOS格式与UNIX格式互转

    LINUX AIX下文本DOS格式与UNIX格式互转 一 文本换行符简介 n 换行 newline LF LineFeed 0x0D r 回车 return CR CarrageReturn 0x0A windows dos r n uni
  • STM32F103用hal库使用DMA+串口空闲中断接收数据

    简介 xff1a 出现空闲标志时 xff0c 认为一帧报文发送完毕 xff0c 进行报文分析 xff0c 比普通的串口中断效率高很多 xff01 用到的工具 xff1a CubeMX xff0c Keil5 芯片 xff1a STM32F1
  • AIX页面空间管理

    一 页面空间相关概念及设计规则 系统中的物理内存是非常有限的 xff0c 因此大多数OS都采用了虚拟内存技术 在AIX系统中也使用分页的存储方式管理存储器 xff0c 并将虚拟内存称为页面空间 Paging space 页面空间 xff1a
  • C/C++中的double类型四舍五入

    一 前言 最近 xff0c 项目中需要对金额进行四舍五入运算 本身系统中全部使用长整型 long or long long xff0c 数据库中使用decimal xff0c 从而防止double类型的精度缺失情况以及数据库中小数点后几位的
  • CAS实现SSO单点登录-CAS Server搭建

    最近公司连续接了三四个单点登录集成的项目 xff0c 由我们公司提供CAS Server端的 xff0c 也有需要我们把Client与其他公司提供的Server端对接的 xff0c 我负责把我们公司的一个Client与另外一个公司提供的Se
  • 从高考到程序员:我的程序探险之旅

    就在今天下午 xff0c 湖南省教育考试院公布了 2017 年湖南省普通高等学校招生全国统一考试的卷面成绩 xff0c 我的微信也瞬间被各种分段统计表和喜报刷屏 xff0c 每年的这个时候总是几家欢喜几家愁 六年前的 6 月 25 日 xf
  • MatconvNet+VS2015+Matlab2018a+CUDA9+cudnn7:在matlab上搞深度学习,安装环境时遇到的大坑!

    事情发生的背景 作为刚入职的深度学习实习生 xff0c 入职第一天 xff0c 我领完电脑 xff0c 刚装完电脑 xff0c 分配好公司的ip xff0c 连chrome都还没来得及安装 xff0c 就接到任务 xff0c 需要实现给定的
  • CAS学习(一) 编译支持REST认证的cas6.2服务端并配置部署测试

    CAS 是 Yale 大学发起的一个开源项目 xff0c 旨在为 Web 应用系统提供一种可靠的单点登录方法 xff0c CAS 在 2004 年 12 月正式成为 JA SIG 的一个项目 CAS 具有以下特点 xff1a 1 开源的企业
  • QEMU

    QEMU 1 使用QEMU创建虚拟机 一 QEMU简介 QEMU是一款开源的模拟器及虚拟机监管器 Virtual Machine Monitor VMM QEMU主要提供两种功能给用户使用 一是作为用户态模拟器 xff0c 利用动态代码翻译
  • 使用virt-install手动创建qcow2镜像并安装ISO

    virt install是一个使用libvirt库构建新虚拟机的命令行工具 xff0c 此工具使用串行控制台 xff0c SDL xff08 Simple DirectMedia Layer xff09 图形或者VNC客户端 服务器 xff
  • OVN总结

    参考 xff1a https www sdnlab com 18600 html 三 OVN L3 对比 Neutron L3 Neutron 的三层功能主要有路由 xff0c SNAT 和 Floating IP xff08 也叫 DNA
  • Keil MDK5 打开MDK4项目

    安装完最新版本keil 5 38a 后 xff0c 需要打开几个MDK4的项目 xff0c 结果一打开keil就提示报错了 这里我选择的是第二种方式 xff0c 首先安装legacy support xff0c 以下是下载链接 MDK v4
  • ubuntu18.04换源及E: 仓库 “http://ppa.launchpad.net/v-launchpad-jochen-sprickerhof-de/pcl/ubuntu bionic Re

    ubuntu18 04换源E 仓库 http ppa launchpad net v launchpad jochen sprickerhof de pcl ubuntu bionic Re问题 1 备份2 修改源3 更新4 解决E 仓库
  • 图像分割2020总结:结构,损失函数,数据集和框架

    点击上方 AI公园 xff0c 关注公众号 xff0c 选择加 星标 或 置顶 作者 xff1a Derrick Mwiti 编译 xff1a ronghuaiyang 导读 一个很好的入门小短文 xff0c 内容很全 xff0c 适合上手
  • 从APM源码分析GPS、气压计惯导融合

    最近事多 xff0c 忙着开源自研飞控 xff0c 现主要工作基本已经完成 xff0c 代码最迟下月中旬开放 xff0c 博客来不及更新 xff0c 还请各位见谅 xff0c 后面会抽空多更的咯 xff01 xff01 xff01 自研飞控

随机推荐

  • 通达OA应用中心操作手册

    第1章应用中心功能介绍 1 1 功能介绍 应用中心是一款以企事业单位广为使用的表单为对象 业务为驱 动 决策为目标 xff0c 以 34 平台 34 43 34 实施 34 的方式 xff0c 进而帮助企事业单位实 现各类管理信息系统的软件
  • 通达OA使用手册(一)

    第一章引言 1 1 编写目的 本用户使用手册目的是将通达 OA 系统的各类操作和功能加以描述 xff0c 以指导 用户更快速正确的使用本系统 该手册分为以下几个部分 xff1a 引言 功能介绍 管 理员手册 用户手册 OA 精灵使用手册和移
  • 通达OA系统管理员操作手册

    3 4 系统管理 安装 OA 后 xff0c 进入 系统管理 菜单 xff0c 对软件功能进行初始化设置 xff0c 以下篇幅主要介绍这个菜单中各个子菜单的作用及使用 3 4 1 功能管理中心 功能管理中心是针对某模块进行权限设置的功能 例
  • ncnn op forward代码学习

    OpenMP支持的编程语言 C C 43 43 和Fortran xff1b 支持OpenMp的编译器包括Visual studio xff0c Sun Compiler xff0c GNU Compiler和Intel Compiler
  • C++ mkdir() 头文件

    mkdir 的头文件在 lt direct h gt
  • POSTMAN从入门到精通系列(二十五):发出SOAP请求

    使用Postman发出SOAP请求 将SOAP端点作为URL 如果您使用的是WSDL 那么请将WSDL的路径作为URL 将请求方法设置为POST 打开原始编辑器 并将正文类型设置为 text xml 在请求正文中 根据需要定义SOAP En
  • POSTMAN从入门到精通系列(二十七):使用GraphQL

    通过Postman中的GraphQL支持 您现在可以使用请求正文创建和发送GraphQL查询 除了创作GraphQL请求外 您还可以 直接在Postman中创建和存储GraphQL模式 启用GraphQL查询自动完成 由Postman AP
  • 解决adb网络连接中出现的“由于目标计算机积极拒绝,无法连接”错误

    在调试一块全志A83T安卓工控板 xff08 已root xff09 xff0c 启动后 xff0c 安卓系统正常 xff0c 设置好以太网 的静态IP地址 xff1a 192 168 1 181 xff0c 并接好网线 xff0c 同时开
  • 【Linux操作系统安装配置GO环境的详细教程】

    1 首先我们进入GO官方 xff0c 查找对应要进行下载到Linux操作系统对应的版本 xff0c 复制链接地址 Go官方环境地址 2 首先进入到下载位置的目录 xff0c 然后到Linux操作系统上执行wget下载命令 然后进行解压 sp
  • Android KEYCODE键值对应大全

    Android KEYCODE 键值对应大全 KEYCODE 列表 电话键 键名 描述 键值 KEYCODE CALL 拨号键 5 KEYCODE ENDCALL 挂机键 6 KEYCODE HOME 按键 Home3 KEYCODE ME
  • CMake版本低升级高版本

    使用cmake命令安装Opencv软件时 xff0c 报如下错误 xff1a CMake Error at CMakeLists txt 4 CMAKE MINIMUM REQUIRED CMake 3 5 4 or higher is r
  • Fiddler弱网测试

    一 弱网简介 弱网看字面意思就是网络比较弱 xff0c 我们通称为信号差 xff0c 网速慢 1 弱网的影响 在地铁 隧道 电梯和车库等场景下使用APP xff0c 网络会出现延时 中断和超时等情况 如果我们处于网速慢的地段 xff0c 我
  • linux创建和删除crontab定时任务

    一 添加sheel脚本 1 首先创建一个执行程序 xff1a vim a sh 2 编辑 xff1a xff01 bin bash python3 python py gt gt test2 log 2 gt amp 1 3 添加权限 xf
  • sphinx文档生成脚手架工具安装和使用

    1 sphinx的安装与使用 1 1 安装sphinx sphinx官方安装说明 xff1a Installing Sphinx Sphinx documentation readthedoc官方说明 xff1a Getting Start
  • geth客户端安装

    geth是以太坊的官方客户端 xff0c 它是一个命令行工具 xff0c 提供很多命令和选项 xff0c 可以运行以太坊节点 创建和管理账户 发送交易 挖矿 部署智能合约等 下面介绍geth的三种安装方法 xff1a 直接下载可执行文件 在
  • win系统下,利用goland来build生成geth.exe可执行文件

    golang环境搭建 具体安装方法就不再赘述 xff0c 但是以太坊对golang的版本有要求 xff0c 得1 7及以上 xff0c 推荐1 9 3 go ethereum代码下载 可以直接访问https github com ether
  • 删除容器命令

    删除容器使用 docker rm 命令 1 删除容器 1 首先需要停止所有的容器 docker stop docker ps a q 2 删除所有的容器 只删除单个时把后面的变量改为container id即可 docker rm dock
  • 正则 (?:)

    X 在正 则中表示所匹配的子组X不作为结果输出 正常情况 X 中的X会被作为新增的一个组序号输出 xff0c 比如 A B xff0c A的序号1 B的序号2 如果 A B xff0c A将没有序号不输出 B的序号为1 规范化url xff
  • 用maven-replacer插件选择正则表达式替换

    在前端html或者jsp中会引入一些诸如css js等静态资源 xff0c 但是有时候浏览器会有缓存 xff0c 更新js后 xff0c 返现一些用户看到的仍然是旧的 xff0c 说明没有生效 这样的话一般是在引入静态资源的时候添加时间戳
  • 【LeetCode股票买卖系列:123. 买卖股票的最佳时机 III 暴力递归=>记忆化搜索=>动态规划】

    x1f680 算法题 x1f680 x1f332 算法刷题专栏 面试必备算法 面试高频算法 x1f340 x1f332 越难的东西 越要努力坚持 xff0c 因为它具有很高的价值 xff0c 算法就是这样 x1f332 作者简介 xff1a