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

相关文章

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义