代码随想录第五十一天——最佳买卖股票时机含冷冻期,买卖股票的最佳时机含手续费

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

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

题目链接:最佳买卖股票时机含冷冻期

  1. 确定dp数组及下标的含义
    dp[i][j]:第i天状态为j,所剩的最多现金为dp[i][j]。

本题的状态可以分为四种:

  • 状态一:持有股票(今天买入股票,或者是之前买入了股票然后没有操作,一直持有),j=0
  • 状态二:保持卖出股票的状态(两天前卖出了股票,前一天是冷冻期。或者是前一天是卖出股票状态,一直没操作),j=1
  • 状态三:今天卖出股票,j=2
  • 状态四:今天为冷冻期状态,但冷冻期状态不可持续,只有一天,j=3

单独列出状态三:今天卖出股票 是因为冷冻期的前一天,只能是 今天卖出股票 状态,如果定义为不持有股票状态就比较模糊,不一定是卖出股票的状态。

  1. 确定递推公式

(1)达到状态一有两种操作:

  • 前一天就是持有股票状态(状态一),dp[i][0] = dp[i - 1][0]
  • 今天买入了,有两种情况:前一天是冷冻期(状态四),dp[i][0] = dp[i - 1][3] - prices[i];前一天是保持卖出股票的状态(状态二),dp[i][0] = dp[i - 1][1] - prices[i]
    dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i])

(2)达到状态二两种操作:

  • 前一天就是状态二
  • 前一天是冷冻期(状态四)
    dp[i][1] = max(dp[i - 1][1], dp[i - 1][3])

(3)达到状态三只有一个操作:

  • 昨天一定是持有股票状态(状态一),今天卖出。
    dp[i][2] = dp[i - 1][0] + prices[i]

(4)达到状态四只有一个操作:

  • 昨天卖出了股票(状态三)
    dp[i][3] = dp[i - 1][2]
  1. dp数组初始化
dp[0][0] = -prices[0]
dp[0][0] = 0
dp[0][0] = 0
dp[0][0] = 0
  1. 确定遍历顺序
    从前向后遍历

整体代码如下:

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();if (n == 0) return 0;vector<vector<int>> dp(n, vector<int>(4, 0));dp[0][0] -= prices[0]; // 持股票for (int i = 1; i < n; i++) {dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]));dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);dp[i][2] = dp[i - 1][0] + prices[i];dp[i][3] = dp[i - 1][2];}return max(dp[n - 1][3], max(dp[n - 1][1], dp[n - 1][2]));}
};

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

leetcode 714. 买卖股票的最佳时机含手续费

题目链接:买卖股票的最佳时机含手续费
dp数组含义:dp[i][0] 表示第i天持有股票所省最多现金。 dp[i][1] 表示第i天不持有股票所得最多现金
(1)如果第i天持有股票,dp[i][0] 由两个状态推出

  • 第i-1天就持有股票,保持现状,dp[i - 1][0]
  • 第i天买入股票,所得现金就是昨天不持有股票的所得现金减去今天的股票价格dp[i - 1][1] - prices[i]
    所以dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i])

(2)如果第i天不持有股票,即dp[i][1]由两个状态推出

  • 第i-1天就不持有股票,保持现状,dp[i - 1][1]
  • 第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金,这里需要减去手续费dp[i - 1][0] + prices[i] - fee
    所以dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee)

整体代码如下:

class Solution {
public:int maxProfit(vector<int>& prices, int fee) {int n = prices.size();vector<vector<int>> dp(n, vector<int>(2, 0));dp[0][0] -= prices[0]; // 持股票for (int i = 1; i < n; i++) {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] - fee);}return max(dp[n - 1][0], dp[n - 1][1]);}
};

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

这篇关于代码随想录第五十一天——最佳买卖股票时机含冷冻期,买卖股票的最佳时机含手续费的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MyBatis-Plus 自动赋值实体字段最佳实践指南

《MyBatis-Plus自动赋值实体字段最佳实践指南》MyBatis-Plus通过@TableField注解与填充策略,实现时间戳、用户信息、逻辑删除等字段的自动填充,减少手动赋值,提升开发效率与... 目录1. MyBATis-Plus 自动赋值概述1.1 适用场景1.2 自动填充的原理1.3 填充策略

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

MySQL 迁移至 Doris 最佳实践方案(最新整理)

《MySQL迁移至Doris最佳实践方案(最新整理)》本文将深入剖析三种经过实践验证的MySQL迁移至Doris的最佳方案,涵盖全量迁移、增量同步、混合迁移以及基于CDC(ChangeData... 目录一、China编程JDBC Catalog 联邦查询方案(适合跨库实时查询)1. 方案概述2. 环境要求3.

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1