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

文章目录

  • 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.hqwc.cn/news/124862.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学会安装Redis数据库到服务器或计算机(Windows版)

Redis 是一个基于内存的开源数据库系统&#xff0c;被广泛应用于 Web 应用、消息队列、缓存、实时统计等领域。它支持多种数据结构&#xff0c;包括字符串、哈希表、列表、集合、有序集合等&#xff0c;并提供了多种操作命令。 Redis 的特点如下&#xff1a; 内存存储&#xf…

【C++】多线程的学习笔记(2)——白话文版(bushi

目录 前一篇 本章内容提要 使用mutex锁的原因 mutex锁的概念 mutex的使用教程 锁的声明以及命名 mutex的加锁以及解锁 例子 结果 注意 mutex的其他方式的锁介绍 lock_guard 介绍 例子 运行结果 adopt_lock参数 unique_lock 介绍 try_to_lock defer_lock re…

堆排序——向下调整

之前我们要想实现堆排序&#xff0c;是运用建堆代码来实现的&#xff1a; 向上调整建堆——向下调整排序 那么去我们可不可以只适用一种调整方法&#xff08;向下调整&#xff09;就能实现这样的功能呢&#xff1f; 向要只使用向下调整就实现堆排序 首先就是把数组里的值使用…

Linux--socket编程

socket套接字编程 一、服务器和客户端的开发步骤&#xff1a; 1、创建套接字 2、为套接字添加信息&#xff08;ip地址和端口号&#xff09; 3、监听网络连接 4、监听到有客户端接入&#xff0c;接受连接&#xff08;如没有接入&#xff0c;会发生阻塞到&#xff09; 5、数据…

导出视频里的字幕

导出视频里的字幕 如何利用剪映快速提取并导出视频里的字幕 https://jingyan.baidu.com/article/c35dbcb0881b6fc817fcbcd2.html 如何快速提取视频中的字幕&#xff1f;给大家介绍一种简单高效又免费的提取方法。需要利用到“剪映”&#xff0c;以下是具体的操作步骤和指引&a…

第2篇 机器学习基础 —(1)机器学习方式及分类、回归

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。机器学习是一种人工智能的分支&#xff0c;它使用算法和数学模型来使计算机系统能够从经验数据中学习和改进&#xff0c;而无需显式地编程。机器学习的目标是通过从数据中发现模式和规律&#xff0c;从而使计算机能够自动进…

SpringMVC(二)@RequestMapping注解

我们先新建一个Module。 我们的依赖如下所示&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaL…

Is This The Intelligent Model(这是智能模型吗)

Is This The Intelligent Model 这是智能模型吗 Ruoqi Sun Academy of Military Science Defense Innovation Institute, Beijing, 100091, China E-mail: ruoqisun7163.com The exposed models are called artificial intelligent models[1-3]. These models rely on knowled…

LOD1.3快速构建 | 多源数据自动化作业、图元和体块模型快速编辑、智能纹理贴图...

2023年&#xff0c;自然资源部先后发布了《实景三维中国建设总体实施方案&#xff08;2023—2025年&#xff09;》、《实景三维中国建设城市三维模型快速构建技术规定&#xff08;征求意见稿&#xff09;》等文件&#xff0c;明确提出&#xff0c;2024年底完成城市三维模型&…

[Unity][VR]Oculus透视开发图文教程1-Passthrough应用XR项目设置

Oculus现在已向开发者公布了如何使用自己的设备Camera,本系列课程就来手把手地告诉你如何在Unity中使用这个特性。 第一步,既然用的是Quest的特性,那就需要先引入Quest的Unity开发SDK。并且完成基本的VR开发项目设置。 新建Unity项目后,在编辑器界面先点击Window,打开资…

Go基础之变量和常量

Go基础之变量和常量 文章目录 Go基础之变量和常量一. 标识符、关键字、内置类型和函数1.1 标识符1.2 关键字1.3 保留字1.4 内置类型1.4.1 值类型&#xff1a;1.4.2 引用类型&#xff1a;(指针类型)1.5 内置函数1.6 内置接口error 二.Go变量命名规范2.1 采用驼峰体命名2.2 简单、…

Redis作为缓存,mysql的数据如何与redis进行同步?

Redis作为缓存&#xff0c;mysql的数据如何与redis进行同步&#xff1f; 一定要设置前提&#xff0c;先介绍业务背景 延时双删 双写一致性:当修改了数据库的数据也要同时更新缓存的数据&#xff0c;缓存和数据库的数据要保持一致 读操作:缓存命中&#xff0c;直接返回;缓存未…