研习代码 day44 | 动态规划——买卖股票的最佳时机 含冷冻期 含手续费

本文主要是介绍研习代码 day44 | 动态规划——买卖股票的最佳时机 含冷冻期 含手续费,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、买卖股票的最佳时机含冷冻期

        1.1 题目

        给定一个整数数组prices,其中第  prices[i] 表示第 i 天的股票价格 。​

        设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

  • 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

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

示例 1:

输入: prices = [1,2,3,0,2]
输出: 3 
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

示例 2:

输入: prices = [1]
输出: 0

提示:

  • 1 <= prices.length <= 5000
  • 0 <= prices[i] <= 1000

        1.2 题目链接

        309.买卖股票的最佳时机含冷冻期

        1.3 解题思路和过程想法

        (1)解题思路

        # 分析:当前状态受前一状态所影响,动态规划问题

        # 数组:每天都有状态——持有、未持有处于冷冻期、未持有不处于冷冻期

        # 递推关系:为好理解层次关系,此处采用二维数组表示
                                dp[i][0] = max(dp[i-1][0], d[i-1][2]-prices[i])
                                dp[i][1] = dp[i-1][1]+prices[i]
                                dp[i][2] = max(dp[i-1][1], dp[i-1][2])

        # 初始化:为降低时间复杂度,此处采用一维滚顶数组的思想存储过程变量
                                dp_0, dp_1, dp_2 = -prices[0], 0, 0

        # 举例递推:               
                               for i in range(1,len(prices)):
                                      dp_0 = max(dp_0, dp_2 - prices[i])
                                      dp_1,dp_2 = dp_0 + prices[i], max(dp_2, dp_1)

        # 结果:因为最后不一定有冷冻期,所以取
                                max(dp_1,dp_2)

        (2)过程想法

        有框架之后,代码是很好写的

        1.4 代码

class Solution:def maxProfit(self, prices: List[int]) -> int:if len(prices) < 2:return 0# 分析:当前状态受前一状态所影响,动态规划问题# 数组:每天都有状态——持有、未持有处于冷冻期、未持有不处于冷冻期# 递推关系:为好理解层次关系,此处采用二维数组表示#          dp[i][0] = max(dp[i-1][0], d[i-1][2]-prices[i])#          dp[i][1] = dp[i-1][1]+prices[i]#          dp[i][2] = max(dp[i-1][1], dp[i-1][2])# 初始化:为降低时间复杂度,此处采用一维滚顶数组的思想存储过程变量dp_0 = -prices[0]dp_1 = 0dp_2 = 0for i in range(1,len(prices)):dp_0 = max(dp_0, dp_2 - prices[i])dp_1,dp_2 = dp_0 + prices[i], max(dp_2, dp_1)return max(dp_1,dp_2)

二、买卖股票的最佳时机含手续费

        2.1 题目

        给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。

        你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。

        返回获得利润的最大值。

        注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。

示例 1:

输入:prices = [1, 3, 2, 8, 4, 9], fee = 2
输出:8
解释:能够达到的最大利润:  
在此处买入 prices[0] = 1
在此处卖出 prices[3] = 8
在此处买入 prices[4] = 4
在此处卖出 prices[5] = 9
总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8

示例 2:

输入:prices = [1,3,7,5,10,3], fee = 3
输出:6

提示:

  • 1 <= prices.length <= 5 * 10^4
  • 1 <= prices[i] < 5 * 10^4
  • 0 <= fee < 5 * 10^4

        2.2 题目链接

        714.买卖股票的最佳时机

        2.3 解题思路和过程想法

        (1)解题思路

        # 分析:当前状态受前一状态所影响,动态规划问题
        # 数组:只有两种状态——持有、未持有
        # 递推关系:为好理解层次关系,此处采用二维数组表示
                          dp[i][0] = max(dp[i-1][0], dp[i-1][1]-prices[i])
                          dp[i][1] = max(dp[i-1][1], dp[i-1][0]+prices[i]-free)

        # 初始化:为降低时间复杂度,此处采用一维滚顶数组的思想存储过程变量
                        dp_0 = -prices[0]
                        dp_1 = 0

        (2)过程想法

        有框架之后,代码是很好写的

        2.4 代码

class Solution:def maxProfit(self, prices: List[int], fee: int) -> int:if len(prices) < 2:return 0# 分析:当前状态受前一状态所影响,动态规划问题# 数组:只有两种状态——持有、未持有# 递推关系:为好理解层次关系,此处采用二维数组表示#           dp[i][0] = max(dp[i-1][0], dp[i-1][1]-prices[i])#           dp[i][1] = max(dp[i-1][1], dp[i-1][0]+prices[i]-free)# 初始化:为降低时间复杂度,此处采用一维滚顶数组的思想存储过程变量dp_0 = -prices[0]dp_1 = 0for i in range(1,len(prices)):dp_0 = max(dp_0, dp_1 - prices[i])dp_1 = max(dp_1, dp_0 + prices[i] - fee)return dp_1

这篇关于研习代码 day44 | 动态规划——买卖股票的最佳时机 含冷冻期 含手续费的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/440734

相关文章

vue基于ElementUI动态设置表格高度的3种方法

《vue基于ElementUI动态设置表格高度的3种方法》ElementUI+vue动态设置表格高度的几种方法,抛砖引玉,还有其它方法动态设置表格高度,大家可以开动脑筋... 方法一、css + js的形式这个方法需要在表格外层设置一个div,原理是将表格的高度设置成外层div的高度,所以外层的div需要

vscode保存代码时自动eslint格式化图文教程

《vscode保存代码时自动eslint格式化图文教程》:本文主要介绍vscode保存代码时自动eslint格式化的相关资料,包括打开设置文件并复制特定内容,文中通过代码介绍的非常详细,需要的朋友... 目录1、点击设置2、选择远程--->点击右上角打开设置3、会弹出settings.json文件,将以下内

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

python多进程实现数据共享的示例代码

《python多进程实现数据共享的示例代码》本文介绍了Python中多进程实现数据共享的方法,包括使用multiprocessing模块和manager模块这两种方法,具有一定的参考价值,感兴趣的可以... 目录背景进程、进程创建进程间通信 进程间共享数据共享list实践背景 安卓ui自动化框架,使用的是

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P