【每日一题】买卖股票的最佳时机 IV

news2024/9/22 5:36:13

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:动态规划
  • 写在最后

Tag

【动态规划】【数组】【2023-10-04】


题目来源

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


题目解读

本题与 121. 买卖股票的最佳时机、122. 买卖股票的最佳时机 II、123. 买卖股票的最佳时机 III 题意目的一致,都是为了获得买卖股票的最大利润。本题不同的是,最多可以买卖股票 k 次。


解题思路

方法一:动态规划

首先来看一下 k,虽然给定了最多可以买卖 k 次,但是 n 天做多可以买卖 ⌊ n 2 ⌋ \lfloor \frac{n}{2} \rfloor 2n 次,因此需要更新 k = m i n ( k , ⌊ n 2 ⌋ ) k = min(k, \lfloor \frac{n}{2} \rfloor) k=min(k,2n⌋)

状态

122. 买卖股票的最佳时机 II 中最多允许进行两次股票的买卖,我们主要有四种状态,分别是第一次买、第一次卖,第二次买和第二次卖。在本题中最多有 k 次股票的买卖就有 k * 2 次的状态,我们可以使用数组来维护。 b u y [ i ] buy[i] buy[i] 表示第 i 次买股票, s e l l [ i ] sell[i] sell[i] 表示第 i 次卖股票。

状态转移

我们的第 i 次买股票手中剩余的最大钱数(也就是最大利润) b u y [ i ] = m a x ( b u y [ i ] , s e l l [ i − 1 ] − p r i c e s [ i ] ) buy[i] = max(buy[i], sell[i-1] - prices[i]) buy[i]=max(buy[i],sell[i1]prices[i])

同理, s e l l [ i ] = m a x ( s e l l [ i ] , b u y [ i − 1 ] + p r i c e s [ i ] ) sell[i] = max(sell[i], buy[i-1] + prices[i]) sell[i]=max(sell[i],buy[i1]+prices[i])

base case

i 次买,我们都初始为 int 类型的最小值,因为买股票手中的钱可能出现负数。为了防止溢出,选择初始化为 INT_MIN / 2

i 次卖股票,我们初始化为 0,因为不会再有比 0 小的卖股票收益了。

最后返回

最后返回 sell.back()sell 数组的最后一个值,即使最大值是 sell 数组中的某一个值,也会因为我们在转移时允许在同一天买入并且卖出这一宽松的条件,最终最大值也是转移到 sell 数组的最后一个值(具体可参考 解题思路中的 最后返回 部分)。

实现代码

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        int n = prices.size();
        k = min(k, n / 2);
        vector<int> buy(k+1, INT_MIN / 2);      // 防止 sell[i-1] - p 溢出
        vector<int> sell(k+1, 0);
        for (int p : prices) {
            for (int i = 1; i <= k; ++i) {
                buy[i] = max(buy[i], sell[i-1] - p);    
                sell[i] = max(sell[i], buy[i] + p);
            }
        }
        return sell.back();
    }
};

复杂度分析

时间复杂度: O ( n   m i n ( n , k ) ) O(n \ min(n, k)) O(n min(n,k)) n n n 是数组 prices 的大小。

空间复杂度: O ( m i n ( n , k ) ) O(min(n, k)) O(min(n,k)),使用的额外空间为数组 buysell 占用的空间。


写在最后

买卖股票系列题目

题目解答
121. 买卖股票的最佳时机【面试经典150】买卖股票的最佳时机
122. 买卖股票的最佳时机 II【面试经典150】买卖股票的最佳时机 II
123. 买卖股票的最佳时机 III【每日一题】买卖股票的最佳时机 III

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

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

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

相关文章

一文拿捏Spring之IOC、循环依赖、Spring的设计模式

1.IOC(控制反转)与DI(依赖注入) &#x1f31f;面试题(IOC-DI): IOC控制反转是一种实现对象解耦的思想。传统情况下是采用new的方式来创建对象&#xff0c;这个对象是由我们来直接控制的&#xff0c;但是有了IOC后&#xff0c;我们可以在IOC运行期间通过DI动态的将依赖的对象进…

嵌入式系统设计与应用---ARM处理器体系结构(学习笔记)

ARM处理器概述 Cortex-A8处理器工作模式 ps&#xff1a;除用户模式以外的其他模式被称为非用户模式或特权模式&#xff1b;除用户模式及系统模式以外的其他模式可称为异常模式 Cortex-A8存储器管理​​​​​​​ ARM的基本数据类型 字节&#xff08;Byte&#xff09;&#…

激活函数介绍

介绍 神经网络当中的激活函数用来提升网络的非线性&#xff0c;以增强网络的表征能力。它有这样几个特点&#xff1a;有界&#xff0c;必须为非常数&#xff0c;单调递增且连续可求导。我们常用的有sigmoid或者tanh&#xff0c;但我们都知道这两个都存在一定的缺点&#xff0c…

第十五章 类和对象——友元

生活中你的家有客厅(Public)&#xff0c;有你的卧室(Private) 客厅所有来的客人都可以进去&#xff0c;但是你的卧室是私有的&#xff0c;也就是说只有你能进去 但是呢&#xff0c;你也可以允许你的好闺蜜好基友进去。 在程序里&#xff0c;有些私有属性 也想让类外特殊的一些…

springboot配置静态资源访问

使用springboot搭建web项目的时候&#xff0c;springboot默认从static目录访问静态资源 例如我们写一个html,然后去访问这个html 内容《你好&#xff01;》 然后运行项目 运行成功&#xff0c;此时我用的端口号是8089 然后去浏览器里访问hello.html http://localhost:8089/…

力扣 -- 879. 盈利计划(二维费用的背包问题)

解题步骤&#xff1a; 参考代码&#xff1a; 未优化的代码&#xff1a; class Solution { public:int profitableSchemes(int n, int minProfit, vector<int>& group, vector<int>& profit) {//计划数int lengroup.size();//每一维都多开一行空间vector&…

查询表中指定列数据

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: select 列名1, 列名2, ..., 列名n from 表名; 想要查多少列就写多少个列名,不需要看的不要写就行了 案例&#xff1a;查询emp表中&…

Spring面试题学习: 单例Bean是单例模式吗?

单例Bean是单例模式吗 学习背景答案扩展知识单例模式Spring BeanJava Bean单例Bean 个人评价我的回答 学习背景 想换工作. 学习记录, 算是一个输出. 答案 通常来说, 单例模式是指在一个JVM中, 一个类只能构造出一个对象. 有很多方法来实现单例模式, 比如饿汉模式. 但是我们通…

使用Pytorch构建神经网络

构建神经网络的典型流程 定义一个拥有可学习参数的神经网络遍历训练数据集处理输入数据使其流经神经网络计算损失值将网络参数的梯度进行反向传播以一定的规则更新网络的权重 我们首先定义一个Pytorch实现的神经网络: # 导入若干工具包 import torch import torch.nn as nn …

【vue】element强制刷新el-carousel的dom:

文章目录 一、问题:二、分析:三、解决: 一、问题: 二、分析: el-carouse里面的数据是最新的&#xff0c;但dom却是前一个的数据 注意&#xff1a;使用了this.$forceUpdate();或this.$set(xx,xx);&#xff0c;没有效果 三、解决: :key"new Date().getTime()"

透明度和透明贴图制作玻璃水杯

1、什么是透明度 模型透明度是指一个物体或模型在呈现时的透明程度。它决定了物体在渲染时&#xff0c;是否显示其后面的物体或背景。 在图形渲染中&#xff0c;透明度通常以0到1之间的值表示。值为0表示完全透明&#xff0c;即物体不可见&#xff0c;背景或其他物体完全穿透…

机器学习笔记(一)

1.线性回归模型 2. 损失函数 3.梯度下降算法 多元特征的线性回归 当有多个影响因素的时候,公式可以改写为: 当有多个影响因素的时候为了方便计算,可以使用 Numpy下面的点积方法, np.dot(w,x) 最后再加个b 就省略了很多书写步骤,这叫做矢量化 多元回归的梯度下降 左边是一…

Nginx实现动静分离

一、概述 1、什么是动静分离 动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来&#xff0c;动静资源做好了拆分以后&#xff0c;我们就可以根据静态资源的特点将其做缓存操作&#xff0c;这就是网站静态化处理的核心思路。 动静分离简单的概…

【ldt_struct结构体的利用】RWCTF2023-Digging-into-kernel-3

ldt_struct 结构体 对于该结构体知识请自行谷歌学习&#xff0c;这里仅仅讲利用 ldt 即局部段描述符表&#xff08;Local Descriptor Table&#xff09;该结构体如下&#xff0c;结构体的大小为 0x10&#xff1a; /** ldt_structs can be allocated, used, and freed, but t…

【算法导论】中位数和顺序统计量

目录 1. 最小值和最大值1.1 寻找最大值或最小值1.2 同时寻找最大值与最小值 2. 期望为线性时间的选择算法2.1 解决的问题2.2 解决的办法2.3 伪代码2.4 RANDOMIZED-SELECT函数运行过程2.5 算法时间复杂度的分析2.5.1 最坏运行时间2.5.2 期望运行时间 3. 最坏为线性时间的选择算法…

斐波那契模型系列【动态规划】

动态规划步骤 1、状态表示 是什么&#xff1a;dp表&#xff08;可能是一维或二维数组&#xff09;里的值所表示的含义。 怎么来&#xff1a; 1、题目要求 2、经验题目要求 3、发现重复子问题 2、状态转移方程 dp[i]... 3、初始化 保证填表不越界 4、填表顺序 5、返回值 写代码时…

基于j2ee的交通管理信息系统/交通管理系统

摘 要 随着当今社会的发展&#xff0c;时代的进步&#xff0c;各行各业也在发生着变化&#xff0c;比如交通管理这一方面&#xff0c;利用网络已经逐步进入人们的生活。传统的交通管理&#xff0c;都是工作人员线下手工统计&#xff0c;这种传统方式局限性比较大且花费较多。计…

IDEA踩坑记录:查找用法 找到的不全怎么办

在我跟CC1链的时候&#xff0c;对InvokerTransformer类的transform()方法进行右键查找用法时&#xff0c;本来应该找到org.apache.commons.collections.map包中的TransformedMap类调用了此方法&#xff0c;但是结果确是没找到。 解决办法&#xff1a; 点击右上方的Maven选项&a…

数据结构 2.1 线性表的定义和基本操作

数据结构三要素——逻辑结构、数据的运算、存储结构&#xff08;物理结构&#xff09; 线性表的逻辑结构 线性表是具有相同数据类型的n&#xff08;n>0&#xff09;个数据元素的有限序列&#xff0c;其中n为表长&#xff0c;当n0时&#xff0c;线性表是一个空表。 每个数…

【Vue】Vue快速入门、Vue常用指令、Vue的生命周期

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Vue 一、 Vue快速入门二、Vue常用指令2.1 v…