研习代码 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

相关文章

HTML5的input标签的`type`属性值详解和代码示例

《HTML5的input标签的`type`属性值详解和代码示例》HTML5的`input`标签提供了多种`type`属性值,用于创建不同类型的输入控件,满足用户输入的多样化需求,从文本输入、密码输入、... 目录一、引言二、文本类输入类型2.1 text2.2 password2.3 textarea(严格

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

SpringBoot实现图形验证码的示例代码

《SpringBoot实现图形验证码的示例代码》验证码的实现方式有很多,可以由前端实现,也可以由后端进行实现,也有很多的插件和工具包可以使用,在这里,我们使用Hutool提供的小工具实现,本文介绍Sp... 目录项目创建前端代码实现约定前后端交互接口需求分析接口定义Hutool工具实现服务器端代码引入依赖获

MyBatis-Plus使用动态表名分表查询的实现

《MyBatis-Plus使用动态表名分表查询的实现》本文主要介绍了MyBatis-Plus使用动态表名分表查询,主要是动态修改表名的几种常见场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录1. 引入依赖2. myBATis-plus配置3. TenantContext 类:租户上下文

利用Python在万圣节实现比心弹窗告白代码

《利用Python在万圣节实现比心弹窗告白代码》:本文主要介绍关于利用Python在万圣节实现比心弹窗告白代码的相关资料,每个弹窗会显示一条温馨提示,程序通过参数方程绘制爱心形状,并使用多线程技术... 目录前言效果预览要点1. 爱心曲线方程2. 显示温馨弹窗函数(详细拆解)2.1 函数定义和延迟机制2.2

Springmvc常用的注解代码示例

《Springmvc常用的注解代码示例》本文介绍了SpringMVC中常用的控制器和请求映射注解,包括@Controller、@RequestMapping等,以及请求参数绑定注解,如@Request... 目录一、控制器与请求映射注解二、请求参数绑定注解三、其他常用注解(扩展)四、注解使用注意事项一、控制

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随