代码随想录打卡第四十一天

news2024/9/9 6:28:33

代码随想录–动态规划部分

day 41 动态规划第8天


文章目录

  • 代码随想录--动态规划部分
  • 一、力扣121--买卖股票的最佳时机
  • 二、力扣122--买卖股票的最佳时机Ⅱ
  • 三、力扣123--买卖股票的最佳时机Ⅲ
  • 总结


一、力扣121–买卖股票的最佳时机

代码随想录题目链接:代码随想录

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

dp数组设置成map

dp[i][0]代表第i天持有股票所得最多现金,而dp[i][1]代表未持有股票时最多的现金

所以如果购入,需要减去当天的价格

那么递推公式?dp[i][0]只面临两种情况,要么是在i之前就已经买了,那么肯定是要保持不变,即dp[i][0] = dp[i-1][0]

另一种情况是在i这里买,说明之前都没买入,则此时的钱一定是0,买入后变成-prices[i]

所以dp[i][0] = max(dp[i-1][0], -prices[i])

再考虑dp[i][1],要么是之前已经卖了,要么是现在卖,所以dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i])

代码如下:

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

    }
};

二、力扣122–买卖股票的最佳时机Ⅱ

代码随想录题目链接:代码随想录

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。

和上题区别在于能够重复购买了,所以在推导dp[i][0]时,如果要在i处购入,并不意味着之前的钱都是0,而要考虑交易后的钱了

也就是dp[i][0] = max(dp[i-1][0], -prices[i])变成dp[i][0] = max(dp[i-1][0], dp[i-1][1] -prices[i])

考虑i-1时刻不持有股票的情况

代码如下:

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

    }
};

这个题确实不如贪心算法来的快,只考虑正收益,相加即可

三、力扣123–买卖股票的最佳时机Ⅲ

代码随想录题目链接:代码随想录

给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。

第三个困难题了,区别在于,不是仅有一次买卖,也不是无限次买卖,而是最多两次

所以每天的状态不再是:有股票 和 没有股票

而是:无、第一次有、第一次无、第二次有、第二次无

那么dp数组就成了 N × 5 N\times 5 N×5的一个数组,每个维度都要有具体的递推公式

dp[i][0]不用想,没买过股票的情况,那自然一直是0,并且递推下去也都是0

dp[i][1]是第一次持有,要么是延续dp[i-1][1],说明之前就第一次持有了,要么是今天买,变成dp[i-1][0]-price[i]

dp[i][2]是第一次不持有,要么是延续dp[i-1][2],之前就卖了,要么是今天卖,变成dp[i-1][1]+prices[i]

那么34也是一样的,用3代替1,4代替2,2代替0即可

初始化只需要考虑第0天即可,dp[0][0] = 0, dp[0][1] = -prices[0], dp[0][2] = 0, 因为没得赚,同一天无利润

dp[0][3] = -prices[0],因为第二次买入是依赖第一次卖出剩余的钱再买入,而 dp[0][2] = 0

同理的,dp[0][4] = 0

代码如下:

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

总结

针对这类股票问题,dp数组定义为 N × 2 N\times 2 N×2一般就能够解决,用来存买入状态和卖出状态的价值即可

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

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

相关文章

一些Kafka面试题

Kafka是如何保证消息不丢失&#xff1f; 1.生产者发送消息到Broker丢失&#xff1a; 设置异步发送&#xff1a;发送失败则使用回调进行记录或者重发 消息重试&#xff1a;参数配置&#xff0c;可以设置重试次数 2.消息在broker中存储丢失 发送确认机制acks acks0&#xf…

创新突破 | OpenCSG发布StarShip CodeReview v1.0.0 Beta版

1. 代码审查很关键但耗时耗力 在软件开发过程中&#xff0c;代码审查是确保代码质量的关键环节。代码审查有助于维护代码标准和发现潜在错误&#xff0c;但也常常耗费大量时间和精力。审查者不仅需要深入理解代码逻辑&#xff0c;还要在繁复的逻辑中识别Bug&#xff0c;这个过…

如何使用 Odoo 16 主生产调度程序规划生产

为了优化运营并提高生产力&#xff0c;企业需要生产管理软件。在当今竞争激烈的经济环境中&#xff0c;有效的资源管理对企业至关重要。为制造业务设计的软件经常用于控制收入增长和盈利能力。ERP&#xff08;企业资源规划&#xff09;系统是专门为制造业创建的&#xff0c;可以…

Java刷题: 丑数判断

题目 丑数 就是只包含质因数 2、3 和 5 的正整数。 给你一个整数 n &#xff0c;请你判断 n 是否为 丑数 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 解题思路 我觉得刷题是为了扩宽思考的广度。看到这题的时候&#xff0c;我的大脑是发懵的…

技术成神之路:设计模式(十)备忘录模式

介绍 备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为设计模式&#xff0c;它允许在不破坏封装性的前提下捕获和恢复对象的内部状态。通过备忘录模式&#xff0c;可以在程序运行过程中保存和恢复对象的某个状态&#xff0c;从而实现“撤销”等功能。 1.定义 备忘…

11 优化器

目录 1. 随机梯度下降系优化器&#xff1a;SGD 1.1 算法种类 1.2 优缺点 2 SGDM 即为SGD with momentum 动量 2.1 公式 2.2 动量的优缺点 优点 缺点 2.3 使用场景 3 AdaGrad 3.1 公式 3.2 AdaGrad的优缺点 优点 缺点 3.3 使用场景 3.4 Adam 3.4.1 Adam优化器的…

倒计时:60秒后再输入验证码

思路1&#xff1a;每隔 1 秒种减 1 &#xff0c;直到减到 0 为止。可以写成公用方法。亲测有效。 countDown(){ const TIME_COUNT 60; if (!this.timer) { this.count TIME_COUNT; this.codeShow false; this.timer setInterval(() > { if (this.count > 0 &&…

苹果密码解锁工具已注册专业版_不限制电脑

Aiseesoft iPhone Unlocker&#xff1a;轻松解锁iPhone。功能强大&#xff1a;一键移除4位、6位密码、Touch ID和Face ID。隐私保护&#xff1a;创建密码&#xff0c;安全无忧。数据提醒&#xff1a;解锁时&#xff0c;注意数据和设置将被清除。Apple ID 解锁&#xff1a;快速删…

【Spring Boot教程:从入门到精通】掌握Spring Boot开发技巧与窍门(三)-配置git环境和项目创建

主要介绍了如何创建一个Springboot项目以及运行Springboot项目访问内部的html页面&#xff01;&#xff01;&#xff01; 文章目录 前言 配置git环境 创建项目 ​编辑 在SpringBoot中解决跨域问题 配置Vue 安装Nodejs 安装vue/cli 启动vue自带的图形化项目管理界面 总结 前言 …

Qt基础 | TCP通信 | TCP服务端与客户端程序设计 | QTcpServer | QTcpSocket

文章目录 一、TCP 通信1.TCP 通信概述2.TCP 服务器端程序设计2.1 主窗口定义与构造函数2.2 网络监听与 socket 连接的建立2.3 与 TCP 客户端进行数据通信 3.TCP 客户端程序设计3.1 主窗口定义与构造函数3.2 与服务器端建立 socket 连接3.3 与 TCPServer 的数据收发 4.小结 Qt 网…

[Docker][Docker Image]详细讲解

目录 1.Docker镜像是什么&#xff1f;2.Docker镜像加载原理1.bootfs2.rootfs3.为什么CentOS镜像几个G&#xff0c;而Docker CentOS镜像才几百M&#xff1f;1.CentOS2.Docker CentOS 3.镜像分层1.Union FS2.分层理解3.容器层 vs 镜像层 4.镜像命令1.docker images2.docker image…

大数据信用报告查询会不会留下查询记录?怎么选择查询平台?

最近有不少网友都在咨询一个问题&#xff0c;那就是大数据信用报告查询会不会留下查询记录&#xff0c;会不会对自己的征信产生影响&#xff0c;下面本文就详细为大家介绍一下&#xff0c;希望对你了解大数据信用有帮助。 首先、大数据信用与人行征信是独立的 很多人只知道人行…

innovus:如何only select highlighted

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 来自星球提问&#xff1b; 1&#xff09;ICC2 2&#xff09;innovus View->Set Preference&#xff0c;勾选Only Select Highlighted

新装centos7虚拟机如何配置网络,NAT配置固定IP

首先声明&#xff0c;我想使用的是NAT连接模式&#xff0c;并且设置完IP之后&#xff0c;使得这个IP固定住&#xff0c;以后不会再变了。 文章目录 1&#xff0c;打开Vmware软件的【编辑】-【虚拟网络编辑器】2&#xff0c;先选择VMnet8&#xff08;画1处&#xff09;&#xf…

2025上海国际显示技术及应用创展览会

DIC EXPO2025中国&#xff08;上海&#xff09;国际显示技术及应用创展览会 时间&#xff1a;2025年8月7-9日 地点&#xff1a;上海新国际博览中心 主办单位&#xff1a; 中国光学光电子行业协会液晶分会 联合主办&#xff1a; 中国电子材料行业协会 中国电子商会 韩国…

嵌入式人工智能(32-基于树莓派4B的旋转编码器-EnCoder11)

1、旋转编码器 旋转编码器是一种输入设备&#xff0c;通常用于测量和控制旋转运动。它由一个旋转轴和一系列编码器组成。旋转编码器可以根据旋转轴的位置和方向来测量旋转角度&#xff0c;并将其转化为电子信号输出。 旋转编码器通常分为两种类型&#xff1a;绝对值编码器和增…

【微服务】Spring Cloud Gateway

文章目录 强烈推荐引言主要功能关键概念示例配置依赖添加常见的几种整合案例1. 与 Spring Cloud Eureka 整合2. 与 Spring Cloud Config 整合3. 与 Spring Cloud Sleuth 和 Zipkin 整合4. 与 Spring Cloud Security 整合5. 与 Resilience4j 整合6. 与 Redis 整合 结论强烈推荐专…

Matlab编程资源库(19)级数与符号方程求解

一、级数符号求和 求无穷级数的和需要 符号表达式求和函数 symsum &#xff0c;其调用 格式为&#xff1a; symsum(s,v,n,m) 其中 s 表示一个级数的通项&#xff0c;是一个符号表达式。 v 是求和变 量&#xff0c; v 省略时使用系统的默认变量。 n 和 m 是求和的开始项 和…

如何恢复WPS文档中未保存或删除的文件

由于各种原因&#xff0c;您可能会丢失 WPS 文档&#xff0c;例如意外删除、硬盘格式化、病毒攻击等。您是否遇到过丢失未保存的 WPS 文件的情况&#xff1f;您知道如何恢复 WPS 文档中未保存的文件吗&#xff1f; WPS Office 是一款办公套件&#xff0c;可以作为 Microsoft O…

火山引擎VeDI数据技术分享:两个步骤,为Parquet降本提效

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 作者&#xff1a;王恩策、徐庆 火山引擎 LAS 团队 火山引擎数智平台 VeDI 是火山引擎推出的新一代企业数据智能平台&#xff0c;基于字节跳动数据平台多年的“数据…