代码随想录Day50|123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

news2024/11/26 0:30:59

文章目录

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

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

文章讲解:代码随想录 (programmercarl.com)

题目链接:123. 买卖股票的最佳时机 III - 力扣(LeetCode)

题目:

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

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

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

分析:

  1. 确定dp数组以及下标的含义

    一天一共就有五个状态,

    1. 没有操作
    2. 第一次买入
    3. 第一次卖出
    4. 第二次买入
    5. 第二次卖出

    dp[i] [j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i] [j]表示第i天状态j所剩最大现金。

  2. 确定递推公式

    需要注意:dp[i] [1],表示的是第i天,买入股票的状态,并不是说一定要第i天买入股票

    达到dp[i] [ 1]状态,有两个具体操作:

    • 操作一:第i天买入股票了,那么dp[i] [1] = dp[i-1] [0] - prices[i]
    • 操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i] [1] = dp[i - 1] [1]

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

    同理dp[i] [2]也有两个操作:

    • 操作一:第i天卖出股票了,那么dp[i] [2] = dp[i - 1] [1] + prices[i]
    • 操作二:第i天没有操作,沿用前一天卖出股票的状态,即:dp[i] [2] = dp[i - 1] [2]

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

    同理可推出剩下状态部分:

    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]);

  3. dp数组如何初始化

  4. 确定遍历顺序

    一定是从前向后遍历

  5. 举例推导dp数组

    以输入[1,2,3,4,5]为例

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

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

188.买卖股票的最佳时机IV

文章讲解:代码随想录 (programmercarl.com)

题目链接:188. 买卖股票的最佳时机 IV - 力扣(LeetCode)

题目:

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

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

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

分析:

  1. 确定dp数组以及下标的含义

在动态规划:123.买卖股票的最佳时机III (opens new window)中,我是定义了一个二维dp数组,本题其实依然可以用一个二维dp数组。

使用二维数组 dp[i] [j] :第i天的状态为j,所剩下的最大现金是dp[i] [j]

j的状态表示为:

  • 0 表示不操作
  • 1 第一次买入
  • 2 第一次卖出
  • 3 第二次买入
  • 4 第二次卖出

大家应该发现规律了吧 ,除了0以外,偶数就是卖出,奇数就是买入

题目要求是至多有K笔交易,那么j的范围就定义为 2 * k + 1 就可以了。

  1. 确定递推公式

还要强调一下:dp[i] [1],表示的是第i天,买入股票的状态,并不是说一定要第i天买入股票,这是很多同学容易陷入的误区

达到dp[i] [1]状态,有两个具体操作:

  • 操作一:第i天买入股票了,那么dp[i] [1] = dp[i - 1] [0] - prices[i]
  • 操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i] [1] = dp[i - 1] [1]

选最大的,所以 dp[i] [1] = max(dp[i - 1] [0] - prices[i], dp[i - 1] [1]);

同理dp[i] [2]也有两个操作:

  • 操作一:第i天卖出股票了,那么dp[i] [2] = dp[i - 1] [1] + prices[i]
  • 操作二:第i天没有操作,沿用前一天卖出股票的状态,即:dp[i] [2] = dp[i - 1] [2]

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

  1. dp数组如何初始化

第0天没有操作,这个最容易想到,就是0,即:dp[0] [0] = 0;

第0天做第一次买入的操作,dp[0] [1] = -prices[0];

第0天做第一次卖出的操作,这个初始值应该是多少呢?

首先卖出的操作一定是收获利润,整个股票买卖最差情况也就是没有盈利即全程无操作现金为0,

从递推公式中可以看出每次是取最大值,那么既然是收获利润如果比0还小了就没有必要收获这个利润了。

所以dp[0] [2] = 0;

第0天第二次买入操作,初始值应该是多少呢?

不用管第几次,现在手头上没有现金,只要买入,现金就做相应的减少。

第二次买入操作,初始化为:dp[0] [3] = -prices[0];

所以同理可以推出dp[0] [j]当j为奇数的时候都初始化为 -prices[0]

  1. 确定遍历顺序

从递归公式其实已经可以看出,一定是从前向后遍历,因为dp[i],依靠dp[i - 1]的数值。

  1. 举例推导dp数组

以输入[1,2,3,4,5],k=2为例。

188.买卖股票的最佳时机IV

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

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

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

相关文章

[附源码]Python计算机毕业设计感动校园人物投稿网站Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

极简入门 2022 docker 部署skywalking9.2.0

安装skywalking服务 官方地址&#xff1a;官网 安装文档&#xff1a;文档地址 拉取镜像 docker pull apache/skywalking-oap-server:9.2.0 docker pull apache/skywalking-ui:9.2.0运行skywalking-oap容器 docker run --name skywalking-oap -e TZAsia/Shanghai -p 12800:1…

ffmpeg的基本用法

title: ffmpeg的基本用法 categories:[ffmpeg] tags:[音视频编程] 一、ffmpeg的安装 1.Centos安装 FFmpeg 在默认的CentOS 8 源仓库中没有提供。你可以选择通过源文件编译安装 FFmpeg&#xff0c;或者使用dnf工具从Negativo17源仓库中安装。我们将会使用第二个选项。 完成…

正大期货数据整合 新鲜事简单报

本周观察重点: &#x1f539;美国11月CPI数据昨晚公布为7.1%&#xff0c;低于市场预期7.3%&#xff0c;较于前值7.7%大幅回落&#xff0c;随通膨回落&#xff0c;静待联准会未来货币政策方向。 12/15 (四) 美国、香港、欧洲、英国、台湾央行12月利率决策会议 12/16 (六) 日本、…

基于java+springboot+mybatis+vue+mysql的小学家校一体作业帮

项目介绍 本系统采用java语言开发&#xff0c;后端采用springboot框架&#xff0c;前端采用vue技术&#xff0c;数据库采用mysql进行数据存储。系统功能如下&#xff1a; 前台&#xff1a; 首页、微社区、试卷、公告通知、个人中心、后台管理 后台&#xff1a; 首页、个人中…

SpringCloud02

1.Nacos配置管理 Nacos除了可以做注册中心&#xff0c;同样可以做配置管理来使用。 1.1.统一配置管理 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&#xff0c;逐个修改微服务配置就会让人抓狂&#xff0c;而且很容易出错。我们需要一种统一配置管理方案&#xff…

技术分享 | 软件项目管理与跨部门沟通协作

项目管理是在项目活动中运用知识、技能、工具和方法&#xff0c;以便达到项目要求。 软件项目管理有其特定的对象、范围和活动&#xff0c;着重关注成本、进度、风险和质量的管理&#xff0c;还需要协调开发团队和客户的关系&#xff0c;协调内部各个团队之间的关系&#xff0…

怎么把pdf格式转成word文档?如何将 PDF 转换为 Word

怎么把pdf格式转成word文档&#xff1f;PDF是运用得很广泛地的办公文档&#xff0c;但是不能编辑&#xff0c;为了方便编辑&#xff0c;需要将PDF转换为word&#xff0c;那么&#xff0c;如何将 PDF 转换为 Word&#xff0c;下面&#xff0c;易我小编会讲解实用的pdf转word的操…

基于VBA实现电缆结构自动出图(二) —— 单芯线

大家敢相信吗&#xff0c;原来VBA竟然可以实现电缆结构自动出图&#xff0c;换句话说&#xff0c;只要输入数据&#xff0c;VBA会自动将电缆的结构画出来&#xff0c;同时还可以渲染&#xff0c;结果竟然不输画图软件&#xff0c;真真让我刮目相看。这里我就不过多介绍VBA了&am…

传奇登录器列表显示不连接

传奇登录器列表显示不连接 我们打开登录器后列表显示不连接怎么办&#xff1f; 图中有打码部分望读者理解&#xff08;平台gz&#xff09; 以下我们大家说下几种列表显示不连接的几种情况 第一种&#xff1a;列表格式错误 在我们开区的位置默认是127.0.0.1 端口默认7000 如果…

Django captcha验证码应用【亲测可用】

1、下载captcha安装包&#xff1a; pip install django-simple-captcha pip3 install pillow -i Simple Index 2、在settings的INSTALLED_APPS添加: captcha&#xff0c; 3、在控制台执行&#xff1a; 生成迁移文件&#xff1a;python3 manage.py makemigrations 迁移文件…

数据流标准差计算方法-不用事先计算均值

数据流标准差计算方法-不用事先计算均值 挑战 标准差(Standard Deviation)是误差有效值的估计&#xff0c;在信号处理里面代表偏差有效值。公式定义需要事先知道均值&#xff08;引自百度百科&#xff09;&#xff1a; 数据流进来&#xff0c;你事先不知道均值&#xff0c;…

【云原生】k8s中kubectl陈述式资源管理

内容预知 1.k8s陈述资源管理方法的说明 1.1 管理k8s核心资源的三种基本方法 陈述式资源管理方法 声明式资源管理方法 GUI式资源管理方法 1.2 kubectl命令行工具 的说明 2.k8s集群中的基本信息查看 2.1 k8s中基本管理信息的查看 &#xff08;1&#xff09;查看版本信息 …

移动端内webview页面调试技巧

前言 长假七天乐确实很爽&#xff0c;只是疫情不稳定&#xff0c;还是呆在家里安全些&#xff0c; 在这宅在家的七天里&#xff0c;何不找点有趣的小demo耍耍 本期教大家制作一个 能播放M3U8直播源的在线电视台网站&#xff0c; 既能学到知识技术&#xff0c;又可以方便在家…

Vue之iconfont

iconfont的使用1.iconfont的使用2.多个iconfont如何做到不冲突1.iconfont的使用 1.打开iconfont官网链接 链接 2.搜索想要的图标&#xff0c;加入购物车 3.点击最上面一行购物车图标&#xff0c;添加至项目 &#xff08;如果没有项目&#xff0c;请先到 资源管理->我的项目…

B2:Unity制作Moba类游戏——聊天系统

一场游戏对局中&#xff0c;和队友进行友好的有礼貌的有效的沟通可以极大提升对局胜率。在LOL国服&#xff0c;打字和队友聊天沟通战术是非常常见的行为&#xff1a; 语言的力量是无限的&#xff0c;甚至可以和外国小伙伴效沟通战术&#xff1a; 聊天系统制作起来非常简单&…

jQuery图片批量上传插件源码,支持批量上传、预览、删除、放大,可配置上传数量、上传大小、追加方式,含详细使用文档

jQuery图片批量上传插件源码&#xff0c;支持批量上传、预览、删除、放大&#xff0c;可配置上传数量、上传大小、追加方式&#xff0c;含详细使用文档 程序包内含使用Demo 完整程序源代码&#xff1a;jQuery图片批量上传插件源码 上传前 上传后 使用方法 1、先引入jquer…

linux搭建nexus私服仓库并简单使用

linux搭建nexus私服仓库并简单使用1、linux搭建nexus私服仓库1.1、下载安装包1.2、linux安装1.3、启动和关闭1.4、登录控制台1.5、账号与密码2、创建自己的私服仓库3、上传 jar 包4、具体项目引入私服仓库1、linux搭建nexus私服仓库 1.1、下载安装包 下载nexus包&#xff0c;这…

用Python写一个新年倒计时

❤️‍&#x1f525;前言&#xff1a; 春回大地&#xff0c;万象更新!春在招手&#xff0c;朋友们&#xff0c;我们一起互相祝愿吧!一年更比一年好。时光苒&#xff0c;岁月如梭。踏着新年欢快的钟声&#xff0c;我们又迎来了这个期待已久的日子过去的一年&#xff0c;我们有泪…

m基于PSO粒子群优化的柔性制造系统AGV调度模型matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 在PSO中&#xff0c;群中的每个粒子表示为向量。在投资组合优化的背景下&#xff0c;这是一个权重向量&#xff0c;表示每个资产的分配资本。矢量转换为多维搜索空间中的位置。每个粒子也会记住它…