【LeetCode股票买卖系列:309. 最佳买卖股票时机含冷冻期 | 暴力递归=>记忆化搜索=>动态规划】

news2024/10/1 5:33:16

在这里插入图片描述

🚀 算法题 🚀

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

🚀 算法题 🚀

在这里插入图片描述

🍔 目录

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

🚗 知识回顾

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

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

🚩 题目链接

  • 309. 最佳买卖股票时机含冷冻期

⛲ 题目描述

给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。​

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

输入: prices = [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
示例 2:

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

提示:

1 <= prices.length <= 5000
0 <= prices[i] <= 1000

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


⚡ 暴力法

🥦 求解思路

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

🥦 实现代码

class Solution {

    int[] prices;

    public int maxProfit(int[] prices) {
        this.prices=prices;
        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-2,0)-prices[i]);
        return Math.max(process(i-1,0),process(i-1,1)+prices[i]);
    }
}

🥦 运行结果

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

在这里插入图片描述


⚡ 记忆化搜索

🥦 求解思路

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

🥦 实现代码

class Solution {
    int[] prices;
    int[][] dp;
    public int maxProfit(int[] prices) {
        this.prices=prices;
        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-2,0)-prices[i]);
        return dp[i][flag]=Math.max(process(i-1,0),process(i-1,1)+prices[i]);
    }
}

🥦 运行结果

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


⚡ 动态规划

🥦 求解思路

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

🥦 实现代码

class Solution {
    int[] prices;
    int[][] dp;
    public int maxProfit(int[] prices) {
        this.prices=prices;
        int n=prices.length;
        dp=new int[n][2];
        dp[0][1]=-prices[0];
        dp[0][0]=0;
        if(n>1){
            dp[1][1]=Math.max(dp[0][1],-prices[1]);
            dp[1][0]=Math.max(dp[0][0],dp[0][1]+prices[1]);
        }
        for(int i=2;i<n;i++){
            dp[i][1]=Math.max(dp[i-1][1],dp[i-2][0]-prices[i]);
            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/485202.html

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

相关文章

C/C++笔记-分析带有Q_OBJECT继承QObject的类make流程

此篇博文记录到个笔记时间2023-02-15&#xff0c;发表到网上的时间是2023-05-03。 这里以Qt5.5.1为例&#xff0c;操作系统是centos 7.5版本。 代码如下&#xff1a; MOCQtConsole.pro QT coreTARGET MOCQtConsoleSOURCES main.cpp \Test.cppHEADERS Test.hTest.h …

Threejs进阶之十二:Threejs与Tween.js结合创建动画

tween.js介绍 Tween.js是一个可以产生平滑动画效果的js库&#xff0c;其官方地址为&#xff1a;https://github.com/tweenjs/tween.js/&#xff0c;可以将源码下载后&#xff0c;可以在tween.js/dist/文件夹下找到相应的js代码&#xff0c;在HTML中进行引用&#xff1b;也可以…

配置KylinV10

配置KylinV10 文章目录 配置KylinV10设置“root”登录密码允许通过图像界面登录到“root”开机自动登录到“root”关闭“麒麟安全授权认证”关闭自动睡眠挂载“Windows”下共享目录到虚拟机安装“Docker”到“KylinV10”B/S安装“Maven-3.6.3”安装“Gradle-4.4.1”安装“Jdk-8…

UG NX二次开发(C++)-建模-创建基准坐标系(NXOpen方法)

文章目录 1、前言2、UG NX中根据菜单来创建基准坐标系2.1 打开UG NX2.2 打开基准坐标系创建界面2.3 根据两个轴和原点创建基准坐标系 3、采用NXOpen方法来创建基准坐标系3.1 创建创建基准坐标系的方法3.2 在do_it方法中添加调用代码3.3 生成dll&#xff0c;并用NXOpen执行来测试…

spring boot原理分析

总体流程 prepareEnvironment里会生成基本的propertySource列表&#xff0c;当然后续还可能会改&#xff0c;比如apollo会在refreshContext时添加自己的propertySource。 prepareContext里会调initializer初始化ApplicationContext&#xff0c;接着加载bean定义。 refreshCo…

深入源码理解redis数据结构(一)

文章目录 一. 动态字符串SDS二. IntSet三. Dict 一. 动态字符串SDS 我们都知道Redis中保存的Key是字符串&#xff0c;value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。不过Redis没有直接使用C语言的字符串&#xff0c;因为C语言字符串存在着很多…

LVS负载均衡集群--DR模式

一、LVS-DR集群介绍 LVS-DR&#xff08;Linux Virtual Server Director Server&#xff09;工作模式&#xff0c;是生产环境中最常用的一 种工作模式。 1、LVS-DR 工作原理 LVS-DR 模式&#xff0c;Director Server 作为群集的访问入口&#xff0c;不作为网关使用&#xff0…

《程序员面试金典(第6版)》面试题 16.11. 跳水板

题目描述 你正在使用一堆木板建造跳水板。有两种类型的木板&#xff0c;其中长度较短的木板长度为shorter&#xff0c;长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法&#xff0c;生成跳水板所有可能的长度。 返回的长度需要从小到大排列。 示例 1 输入&a…

Request和Response应用

ServletRequest应用 ServletRequest应用非常广泛&#xff0c;下面是一些例子&#xff1a; 获取请求参数&#xff1a;可以使用HttpServletRequest的getParameter()方法获取请求参数。 获取请求头信息&#xff1a;可以使用HttpServletRequest的getHeader()方法获取请求头信息。…

数据结构(六)—— 二叉树(3)

文章目录 题1 589 N 叉树的前序遍历2 226 翻转二叉树递归迭代 3 101 对称二叉树递归迭代 4 104 二叉树的最大深度层序遍历直接解决递归 5 111 二叉树的最小深度层序遍历递归 6 222 完全二叉树的节点个数递归遍历 7 110 平衡二叉树递归 题 递归三部曲 1、确定递归函数的参数和返…

如何使用 PyTorch 进行半精度、混(合)精度训练

https://featurize.cn/notebooks/368cbc81-2b27-4036-98a1-d77589b1f0c4 nvidia深度学习加速库apex简单介绍 NVIDIA深度学习加速库Apex是一个用于PyTorch的开源混合精度训练工具包&#xff0c;旨在加速训练并减少内存使用。Apex提供了许多用于混合精度训练的工具&#xff0c;…

【Python基础入门学习】Python函数与变量的使用

python语法 1. 函数的快速体验2. 函数的基本使用2.1 函数的定义2.2 函数的调用2.3 第一个函数演练2.4 PyCharm 的调试工具2.5 函数的文档注释 3. 函数的参数3.1 函数参数的使用3.2 函数参数的作用3.3 形参和实参 4. 函数的返回值5. 函数的嵌套使用6 使用模块中的函数6.1 第一个…

码出高效:Java开发手册笔记(线程池及其源码)

码出高效&#xff1a;Java开发手册笔记&#xff08;线程池及其源码&#xff09; 码出高效&#xff1a;Java开发手册笔记&#xff08;线程池及其源码&#xff09; 码出高效&#xff1a;Java开发手册笔记&#xff08;线程池及其源码&#xff09;前言一、线程池的作用线程的生命周…

剑指 Offer:003 前 n 个数字二进制中 1 的个数

题目&#xff1a; 给定一个非负整数 n&#xff0c;请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数&#xff0c;并输出一个数组 示例&#xff1a; 1、 输入: n 2 输出: [0,1,1] 解释: 0 --> 0 1 --> 1 2 --> 10 2、 输入: n 5 输出: [0,1,1,2,1,2] 解释: 0 …

第2关:用flex生成PL语言的词法分析器

任务描述 经过上个任务的磨砺&#xff0c;相信大家已经熟悉了lex/flex的使用。这一次我们将利用flex工具生成PL语言的词法分析器&#xff0c;要求输入一个PL语言源程序文件demo.pl&#xff0c;输出一个文件tokens.txt&#xff0c;该文件包括每一个单词及其种别枚举值&#xff0…

【五一创作】Qt quick基础1(包含基本元素Text Image Rectangle的使用)

Qt quick基础1&#xff08;包含基本元素Text Image Rectangle的使用&#xff09; 目录 Qt quick基础1&#xff08;包含基本元素Text Image Rectangle的使用&#xff09;前言qt中有直接设计ui的拖拽式的widget&#xff0c;为什么还需要Qtquick?QML语言Qt 版本创建一个Qt quick项…

两分钟学会 制作自己的浏览器 —— 并将 ChatGPT 接入

前期回顾 分享24个强大的HTML属性 —— 建议每位前端工程师都应该掌握_0.活在风浪里的博客-CSDN博客2分享4个HTML5 属性&#xff0c;开发必备https://blog.csdn.net/m0_57904695/article/details/130465836?spm1001.2014.3001.5501 &#x1f44d; 本文专栏&#xff1a;开发…

一文解决MySQL突击面试,关键知识点总结

文章目录 MySQL重要知识点回顾一、索引1. 为什么需要索引2. 索引的结构3. 避免索引失效3.1 联合索引不满足最左匹配原则3.2 隐式转换3.3 like查询3.4 索引列存在运算或者使用函数3.5 优化器 4. 执行计划4.1 type4.2 key4.3 rows4.4 extra 5. 建立索引5.1 什么情况下应该建索引&…

【Unity入门】24.碰撞检测

【Unity入门】碰撞检测 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;碰撞体 &#xff08;1&#xff09;Collider组件 上节课我们有学习到&#xff0c;unity的物理系统提供了更方便的碰撞…

SPSS如何制作基本统计分析报表之案例实训?

文章目录 0.引言1.制作在线分析处理报告2.制作个案摘要报告3.制作行形式摘要报告4.制作列形式摘要报告 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对SPSS进行了学习&#xff0c;本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结…