2024/06/18--代码随想录算法8/17| 股票问题

121.买卖股票的最佳时机

力扣链接
在这里插入图片描述
动规五部曲

  1. 确定dp数组(dp table)以及下标的含义
    dp[i][0] 表示第i天持有股票所得最多现金,dp[i][1] 表示第i天不持有股票所得最多现金
  2. 确定递推公式
    在这里插入图片描述
    dp[i][0] = max(dp[i-1][0], -price[i])
    dp[i][1]=max(dp[i-1][1], dp[i-1][0]+price[i])
  3. dp数组初始化
    那么dp[0][0]表示第0天持有股票,此时的持有股票就一定是买入股票了,因为不可能有前一天推出来,所以dp[0][0] -= prices[0];
    dp[0][1]表示第0天不持有股票,不持有股票那么现金就是0,所以dp[0][1] = 0;
  4. 遍历顺序 :dp[i]都是由dp[i - 1]推导出来的,那么一定是从前向后遍历。
    股票只能买入一次,卖出一次,要先买,才能卖,
    dp[i][0] = max(dp[i-1][0], -prices[i]),而不是max(dp[i-1][0], dp[i-1][1]-prices[i])

动态规划

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        length = len(prices)
        if len == 0:
            return 0
        dp = [[0] * 2 for _ in range(length)]
        dp[0][0] = -prices[0]
        dp[0][1] = 0
        for i in range(1, length):
            dp[i][0] = max(dp[i-1][0], -prices[i])
            dp[i][1] = max(dp[i-1][1], prices[i] + dp[i-1][0])
        return dp[-1][1]
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        length = len(prices)
        dp0, dp1 = -prices[0], 0 #注意这里只维护两个常量,因为dp0的更新不受dp1的影响
        for i in range(1, length):
            dp1 = max(dp1, dp0 + prices[i])
            dp0 = max(dp0, -prices[i])
        return dp1

贪心法

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        low = float("inf")
        result = 0
        for i in range(len(prices)):
            low = min(low, prices[i]) #取最左最小价格
            result = max(result, prices[i] - low) #直接取最大区间利润
        return result

122.买卖股票的最佳时机II

力扣链接
在这里插入图片描述
动规五部曲

  1. 确定dp数组(dp table)以及下标的含义
    dp[i][0] 表示第i天持有股票所得最多现金,dp[i][1] 表示第i天不持有股票所得最多现金
  2. 确定递推公式
    dp[i][0] = max(dp[i-1][0], dp[i-1][1]-price[i])
    dp[i][1]=max(dp[i-1][1], dp[i-1][0]+price[i])
  3. dp数组初始化
    那么dp[0][0]表示第0天持有股票,此时的持有股票就一定是买入股票了,因为不可能有前一天推出来,所以dp[0][0] -= prices[0];
    dp[0][1]表示第0天不持有股票,不持有股票那么现金就是0,所以dp[0][1] = 0;
  4. 遍历顺序
    和上一题的区别在于,本题股票可以买卖多次
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);

时间复杂度:O(n) 空间复杂度:O(n)

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        length = len(prices)
        dp = [[0] * 2 for _ in range(length)]
        dp[0][0] = -prices[0]
        dp[0][1] = 0
        for i in range(1, length):
            dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i]) #注意这里是和121. 买卖股票的最佳时机唯一不同的地方
            dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i])
        return dp[-1][1]

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

力扣链接
在这里插入图片描述
动规五部曲

  1. 确定dp数组(dp table)以及下标的含义
    在这里插入图片描述
  2. 确定递推公式
    dp[i][1]=max(dp[i-1][1], -price[i])
    dp[i][2]=max(dp[i-1][2], dp[i-1][1]+price[i])
    dp[i][3] = max(dp[i-1][3], dp[i-1][2]-price[i])
    dp[i][4] = max(dp[i-1][4],dp[i-1][3]+price[i])
  3. dp数组初始化
    那么dp[0][0]表示第0天持有股票,所以dp[0][0] = -prices[0];
    dp[0][1]表示第0天不持有股票,不持有股票那么现金就是0,所以dp[0][1] = 0;
    dp[0][3] = -prices[0]
    dp[0][4] = 0
  4. 遍历顺序 :dp[i]都是由dp[i - 1]推导出来的,那么一定是从前向后遍历。
    股票至多买卖两次,可以买卖2次,买卖1次,或者不买卖
    第二次必须在第一次之后后面,控制dp[i][3] = max(dp[i-1][3], dp[i-1][2] - prices[i]),而不是dp[i][3] = max(dp[i-1][3], dp[i-1][4] - prices[i]),后面这种是两个独立的一次买卖
    现在最大的时候一定是卖出的状态,而两次卖出的状态现金最大一定是最后一次卖出。如果想不明白的录友也可以这么理解:如果第一次卖出已经是最大值了,那么我们可以在当天立刻买入再立刻卖出。所以dp[4][4]已经包含了dp[4][2]的情况。也就是说第二次卖出手里所剩的钱一定是最多的。

时间复杂度:O(n) 空间复杂度:O(n × 5)

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        if len(prices) == 0:
            return 0
        dp = [[0] * 5 for _ in range(len(prices))]
        dp[0][1] = -prices[0]
        dp[0][3] = -prices[0]
        for i in range(1, len(prices)):
            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[-1][4]
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        if len(prices) == 0:
            return 0
        dp = [0] * 5 
        dp[1] = -prices[0]
        dp[3] = -prices[0]
        for i in range(1, len(prices)):
            dp[1] = max(dp[1], dp[0] - prices[i])
            dp[2] = max(dp[2], dp[1] + prices[i])
            dp[3] = max(dp[3], dp[2] - prices[i])
            dp[4] = max(dp[4], dp[3] + prices[i])
        return dp[4]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spark独立集群搭建

spark独立集群搭建(不依赖Hadoop) 1、上传spark-2.4.5-bin-hadoop2.7.tgz至 /usr/local/moudel ,再解压到 /usr/local/soft tar -zxvf spark-2.4.5-bin-hadoop2.7.tgz -C /usr/local/soft/ 重命名 mv spark-2.4.5-bin-hadoop2.7/ spark-2.4.5 配…

深入理解计算机系统 CSAPP 家庭作业6.45

CS:APP3e, Bryant and OHallaron 可以参考这里

mediasoup源码分析(三)channel创建及信令交互

mediasoup源码分析--channel创建及信令交互 概述跨职能图业务流程图代码剖析 概述 在golang实现mediasoup的tcp服务及channel通道一文中,已经介绍过信令服务中tcp和channel的创建,本文主要讲解c中mediasoup的channel创建,以及信令服务和medi…

深圳比创达电子EMC|EMC与EMI滤波器:守护电子设备的电磁防火墙

随着科技的飞速发展,电子设备在我们日常生活中的普及率越来越高,从智能手机到大型工业设备,无一不体现出电子技术的重要地位。然而,随之而来的电磁兼容性问题(EMC)和电磁干扰问题(EMI&#xff0…

基于稀疏学习现代信号处理方法的旋转机械故障诊断(MATLAB)

通过对滚动轴承故障诊断研究现状及稀疏表示方法在滚动轴承故障诊断领域中应用现状的调研,发现稀疏表示方法与故障特征提取和故障分类的关联,针对故障诊断问题,通过构造合理的故障稀疏表示模型,选取适合的模型优化算法,…

华为HCIP Datacom H12-821 卷6

1.单选题 下面是一台路由器的部分配置,关于该部分配置描述正确的是,[HUAWEllJip ip-prefix plpermit 10.0.192.0 8 greater-equal 17 less-equal 18 A、10.0.192.0/8 网段内,掩码长度为 20 的路由会匹配到该前缀列表,匹配规则为…

[保姆级教程]uniapp配置vueX

文章目录 注意新建文件简单的使用 注意 uniapp是支持vueX的只需配置一下就好 新建文件 在src文件中,新建一个store(如果有的话跳过) 在store中新建一个js文件,修改js文件名称和选择模板为default 在 uni-app 项目根目录下&…

牛客周赛 F-花花的地图

原题链接:F-花花的地图 题目大意:的网格里面,.为可以通行,#为不可以通行,如果想要通行可以花费代价将一列的障碍全部清除,求从到的最小花费。 思路:迪杰斯特拉的变种,优先队列里面…

用研究的眼光解读如何基于UVM搭建验证平台《UVM实战》(可下载)

UVM(Universal Verification Methodology,通用验证方法学)是一种用于硬件设计和验证的标准化方法学,它基于SystemVerilog语言扩展,由Accellera组织推出,并得到了主要的EDA(Electronic Design Au…

重磅!首个跨平台的通用Linux端间互联组件Klink在openKylin开源

随着智能终端设备的普及,多个智能终端设备之间的互联互通应用场景日益丰富,多设备互联互通应用场景需要开发者单独实现通讯协议。因此,为解决跨平台互联互通问题,由openKylin社区理事单位麒麟软件旗下星光麒麟团队成立的Connectiv…

音频处理软件adobe audition使用教程

教程1笔记 基本操作 点击文件-》新建-》多轨会话: 编辑-》首选项,设置自动保存时间: 导入素材,文件-》导入素材,或者直接拖动进来文件! 导出多轨混音: 更改为需要导出的格式wav,mp3等格式&am…

ROS程序设计系列 - 2.ROS Package

ROS程序设计系列 - 2.ROS Package 1. 源由2. 关键要点2.1 ROS包组成2.2 消息解耦2.3 包版本管理2.4 编译配置2.5 ROS C Client Library2.5.1 Initialization and spinning2.5.2 Node handle2.5.3 Logging2.5.4 Subscribe and Publisher2.5.5 Parameters 2.6 Object Oriented Pr…

【Android】使用Binder(AIDL)实现利用自定义Bean进行的进程间通信(二)

项目前置 这是我之前写的关于Binder的一些知识点和使用基本数据类型在通信的文章,感兴趣的可以看一下: Binder(一)Binder的介绍和AIDL使用Binder的实例 项目目标 在两个APP之间进行数据传递,使用Android推荐的Binder通讯&#…

产业生态远超预期,商用进程全面提速:5G RedCap,凭什么这么火?

2022年6月,3GPP R17版本正式宣布冻结。除了针对传统5G技术标准进行完善之外,R17还推出了一项新的中高速物联技术标准,也就是我们今天文章的主角——RedCap。 RedCap推出后,受到了业界上下的广泛关注。它在传统5G的基础上&#xff…

新手小白系列——关于 Docker 安装的方法

Docker 是一个应用打包、分发、部署的工具基础概念: 镜像:软件安装包,可以方便的进行传播和安装。 容器:软件安装之后的状态,每个软件运行环境都是独立的、隔离的,称之为容器 仓库:专门用来传播…

k8s集群新增计算节点使用华为iscsi存储创建的pvc存储挂载报错:FailedMount

背景: 因公司业务需求的增长,导致kubernetes集群测试环境的计算节点资源不够使用了,这时候就申请了几台服务器加入到kubernetes集群中,因为维护的kubernetes集群的对接华为了iscsi存储,通过storageclass组件来创建pvc存…

Vue3中的常见组件通信之插槽

Vue3中的常见组件通信之插槽 概述 ​ 在vue3中常见的组件通信有props、mitt、v-model、 r e f s 、 refs、 refs、parent、provide、inject、pinia、slot等。不同的组件关系用不同的传递方式。常见的撘配形式如下表所示。 组件关系传递方式父传子1. props2. v-model3. $refs…

GANs网络在图像和视频技术中的应用前景

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

vue3中实现3D地图——three.js

需求点 地图区域大小随着父盒子大小变动,窗口缩放自动适配每个区域显示不同颜色和高度,描边每个区域显示名字label和icon点击区域改变其透明度,并且弹窗显示信息窗口点击点也可以可以自由放大缩小,360度旋转 包 npm install d3^…

lib9-02 配置扩展 ACL

实验:配置扩展 ACL 1、实验目的 通过本实验可以掌握编号扩展 ACL 定义和应用的方法命名扩展 ACL 定义和应用的方法 2、实验拓扑 实验拓扑如下图所示。使用扩展 ACL 实现如下访问控制 拒绝 PC1 所在网段访问 Server1 的 Web 服务拒绝 PC2 所在网段访问 Server1 …