代码随想录算法训练营第五十天 |123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

news2024/11/28 4:31:49

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

题目链接/文章讲解:代码随想录

视频讲解:动态规划,股票至多买卖两次,怎么求? | LeetCode:123.买卖股票最佳时机III_哔哩哔哩_bilibili

 思考:

至多买卖两次,这意味着可以买卖一次,可以买卖两次,也可以不买卖

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

一天一共就有五个状态,

  1. 没有操作 (也可以不设置这个状态)
  2. 第一次持有股票
  3. 第一次不持有股票
  4. 第二次持有股票
  5. 第二次不持有股票

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

2.确定递推公式

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

  • 操作一:第i天买入股票了,那么dp[i][1] = dp[i-1][0] - prices[i]
  • 操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1] = 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][3], dp[i - 1][2] - prices[i])

dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i])

3.dp数组的初始化

dp[0][0] = 0

dp[0][1] = -prices[0]

dp[0][2] = 0 【可以理解当天买入,当天卖出】

dp[0][3] = -prices[0]

【第二次买入依赖于第一次卖出的状态,其实相当于第0天第一次买入了,第一次卖出了,然后再买入一次(第二次买入),那么现在手头上没有现金,只要买入,现金就做相应的减少】

dp[0][4] = 0

【同理第二次卖出】

4.确定遍历顺序

从前向后

5.举例推导dp数组

代码实现: 

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][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[prices.size() - 1][4];
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n×5)

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

题目链接/文章讲解:代码随想录

视频讲解:动态规划来决定最佳时机,至多可以买卖K次!| LeetCode:188.买卖股票最佳时机4_哔哩哔哩_bilibili

思考:

这道题目可以说是动态规划:123.买卖股票的最佳时机III的进阶版,这里要求至多有k次交易

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

j的状态表示为:

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

规律:除了0以外,偶数就是卖出,奇数就是买入

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

vector<vector<int>> dp(prices.size(), vector<int>(2 * k + 1, 0));

2.确定递推公式

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

 同理可以类比剩下的状态,代码如下:        

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

3.dp数组的初始化

for (int j = 1; j < 2 * k; j += 2) {
    dp[0][j] = -prices[0];
}

4.确定遍历顺序

从前向后

5.举例推导dp数组

代码实现: 

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];
    }
};
  • 时间复杂度:O(n×k),其中 n 为 prices 的长度
  • 空间复杂度:O(n×k)

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

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

相关文章

【算法挨揍日记】day09——35. 搜索插入位置、69. x 的平方根

35. 搜索插入位置 35. 搜索插入位置 题目描述&#xff1a; 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 解题思…

德国云安全协作软件提供商【Rencore】完成800万美元融资

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于德国慕尼黑的云安全协作软件提供商Rencore今日宣布已完成800万美元融资。 本轮融资由UVC Partners领投。 该公司打算利用这笔资金进一步投资于其云协作治理产品的增长。 Rencore由Matthi…

机器学习7:逻辑回归

一、说明 逻辑回归模型是处理分类问题的最常见机器学习模型之一。二项式逻辑回归只是逻辑回归模型的一种类型。它指的是两个变量的分类&#xff0c;其中概率用于确定二元结果&#xff0c;因此“二项式”中的“bi”。结果为真或假 — 0 或 1。 二项式逻辑回归的一个例子是预测人…

公众号留言小程序有哪些?要免费的

为什么公众号没有留言功能&#xff1f;2018年2月12日之后直到现在&#xff0c;新注册公众号的运营者会发现一个问题&#xff1a;无论是个人还是企业的公众号&#xff0c;在后台都找不到留言功能了。这对公众号来说绝对是一个极差的体验&#xff0c;少了一个这么重要的功能&…

掌握这些技巧,让Excel批量数据清洗变得简单高效!

什么是数据清洗 数据清洗是指在数据处理过程中对原始数据进行筛选、转换和修正&#xff0c;以确保数据的准确性、一致性和完整性的过程。它是数据预处理的一部分&#xff0c;旨在处理和纠正可能存在的错误、缺失值、异常值和不一致性等数据质量问题。 为什么要数据清洗 Exce…

南京大学【软件分析】07 Interprocedural Analysis

文章目录 1. Motivation2. Call graph Construction&#xff08;CHA&#xff09;2.1 方法分派Method Dispatch2.2 方法签名method signature2.3 案例&#xff1a;查找Dispatch2.4 CHA2.5 通过CHA构造调用图 3. Interprocedural Control-Flow Graph4. Interprocedural Data-Flow…

DBA数据库运维-MySQL安装篇(glibc,源码)

1. MySQL数据库版本 版本说明社区版: MySQL Community Edition (GPL)1.可以看做是企业版的“广泛体验版(小白鼠版)"&#xff0c;未经各个专有系统平台的压力和性能测试 2.基于GPL协议发布&#xff0c;可以随意下载使用 3.没有任何官方技术支持服务企业版:MySQL Enterpris…

经典循环神经网络(一)RNN及其在歌词数据集上的应用

经典循环神经网络(一)RNN及其在歌词数据集上的应用 1 RNN概述 在深度学习兴起之前&#xff0c;NLP领域一直是统计模型的天下&#xff0c;例如词对齐算法GIZA&#xff0c;统计机器翻译开源框架MOSES等等。在语言模型方向&#xff0c;n-gram是当时最为流行的语言模型方法。n-gr…

YoloV8改进策略:SPD-Conv加入到YoloV8中,让小目标无处遁形

摘要 SPD-Conv是一种新的构建块,用于替代现有的CNN体系结构中的步长卷积和池化层。它由一个空间到深度(SPD)层和一个非步长卷积(Conv)层组成。 空间到深度(SPD)层的作用是将输入特征图的每个空间维度降低到通道维度,同时保留通道内的信息。这可以通过将输入特征图的每…

关于日志系统

目录 日志落地类&#xff08;工厂模式&#xff09;双缓冲区异步处理器缓冲区异步工作器 日志器类同步日志器异步日志器构造日志器构造局部日志器构造全局日志器日志器管理器&#xff08;单例模式&#xff09; 日志宏&全局接口&#xff08;代理模式&#xff09; 源码&#x…

使用 cURL 发送 HTTP 请求: 深入探讨与示例

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Vue3之Suspense

<Suspense> 是一个内置组件&#xff0c;用来在组件树中协调对异步依赖的处理。它让我们可以在组件树上层等待下层的多个嵌套异步依赖项解析完成&#xff0c;并可以在等待时渲染一个加载状态。 我们可以看到官网并不推荐我们使用它&#xff0c;目前仍处于测试中。 他用于加…

【算法系列篇】哈希表

文章目录 前言1. 两数之和1.1 题目要求1.2 做题思路1.3 Java代码实现 2. 判断是否为字符重排2.1 题目要求2.2 做题思路2.3 Java代码实现 3. 存在重复元素3.1 题目要求3.2 做题思路3.3 Java代码实现 4. 存在重复元素II4.2 题目要求4.2 做题思路4.3 Java代码实现 5. 字母异位词分…

Guitar Pro 8 .1全新功能介绍及2023官方特惠优惠券

《中国好声音》节目诞生10年多热度不减&#xff0c;每一季都有籍籍无名的学员成为万众瞩目的新星。怎么像他们一样把爱好变成事业&#xff1f;带着这个问题在不断的探寻中找到了答案&#xff0c;那就是要在有限的时间里比别人做效率更高的事。所谓“工欲善其事&#xff0c;必先…

超百家上市公司抛出回购、增持计划

9月以来&#xff0c;多家上市公司披露回购方案或增持计划&#xff0c;持续向市场传递积极信号&#xff0c;以真金白银提振市场信心。 Wind统计显示&#xff0c;截至9月28日&#xff0c;9月以来已有77家上市公司披露回购预案&#xff0c;其中多家公司发布超过亿元的回购计划。 …

WINDOWS与LINUX的文件文件共享

打开VMware: 点击虚拟机->点击设置 出来虚拟机设置&#xff0c;咱们点击选项->有个共享文件夹点击->选择总是启用->点击添加 下一步 此处选择一个windows下与虚拟机共享的一个目录 最后确定就ok了 那怎么在虚拟机Linux中访问共享文件呐 在文件的其他位置选择计…

SpringMVC如何处理表单提交与文件上传

SpringMVC处理表单提交与文件上传 SpringMVC是一个流行的Java框架&#xff0c;用于构建Web应用程序。它提供了强大的功能来处理表单提交和文件上传操作。本文将深入探讨SpringMVC如何处理这些常见的Web任务&#xff0c;以及如何使用示例代码来实现它们。 表单提交处理 表单提…

基于 SpringBoot+Vue 的企业人事管理系统

1 简介 本文讲解的是 Java基于 SpringBoot 的人事管理系统。本系统涉到的功能主要有&#xff1a;首页&#xff0c;个人中心&#xff0c;员工管理&#xff0c;部门管理&#xff0c;员工考勤管理&#xff0c;请假申请管理&#xff0c;加班申请管理&#xff0c;员工工资管理&…

cesium 鹰眼图2

cesium 鹰眼图2 1、实现方法 本文采用cesium 和 leaflet 来时实现,鹰眼采用leaflet来实现 2、示例代码 2.1 <!DOCTYPE html> <html><head><meta charset="utf-8">