309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

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

力扣题目链接(opens new window)

给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。

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

  • 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
  • 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

示例:

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

思路

思路:动态规划
相比于买卖股票II,引入了冰冻期概念。需要将不持有股票的状态进行拆分。
分为三部分:刚卖出股票  正处于冰冻期  冰冻期结束
动态规划五部曲
1.dp数组以及下标代表含义
定义二维dp数组dp[i][j] 表示第i天最大利润
j = 0 表示持有股票
j = 1 表示刚卖出股票
j = 2 表示在冰冻期
j = 3 表示度过冰冻期2.确定递推公式
第i天持有股票dp[i][0]
1.前一天持有股票 dp[i-1][0]
2.前一天在冰冻期 dp[i-1][2] - prices[i]
3.前一天度过冰冻期 dp[i-1][3] - prices[i]
第i天刚卖出股票 dp[i][1]
1.前一天持有股票 dp[i-1][0] + prices[i]
在冰冻期 dp[i][2]
1.前一天刚卖出股票 dp[i-1][1]
度过冰冻期dp[i][3]
1.前一天度过冰冻期 dp[i-1][3]
2.前一天在冰冻期 dp[i-1][2]3.dp数组初始化
dp[0][1] = -prices[0]
4.遍历顺序,dp[i]由dp[i-1]推导,故正序
5.举例推导dp数组
时间复杂度o(n)
空间复杂度o(n)

代码如下

public static int maxProfit(int[] prices) {if (prices == null || prices.length == 0)return 0;int[][] dp = new int[prices.length][4];dp[0][0] = -prices[0];for (int i = 1; i < prices.length; i++) {dp[i][0] = Math.max(Math.max(dp[i - 1][0], dp[i - 1][2] - prices[i]), dp[i - 1][3] - prices[i]);dp[i][1] = dp[i - 1][0] + prices[i];dp[i][2] = dp[i - 1][1];dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][2]);}return Math.max(Math.max(dp[prices.length - 1][1], dp[prices.length - 1][2]), dp[prices.length - 1][3]);
}

优化

二刷时使用另一种思路解决问题
相比上面的思路,我个人理解刚卖出股票这种状态,其实没有必要,也不好想。用持有股票的状态完全可以代替
而且上面的思路没有给出【没有买过股票的状态】(其实我们也可以不设置这个状态)
但我个人认为这种状态最好列出,会让状态流转更完整。
j = 0 未持有股票(包含两个状态1.没有买过股票和2.冷冻期度过后没有买股票)
j = 1 持有股票
j = 2 处于冷冻期
未持有股票。1.前一天未持有股票2.前一天处于冷冻期
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][2]);
持有股票。1.前一天持有股票2.前一天未持有股票
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
处于冷冻期。1.前一天刚卖出股票
dp[i][2] = dp[i - 1][1] + prices[i];
时间复杂度o(n)
空间复杂度o(n)

代码如下

public static int maxProfit(int[] prices) {if (prices == null || prices.length == 0)return 0;int[][] dp = new int[prices.length][3];dp[0][1] = -prices[0];for (int i = 1; i < prices.length; i++) {dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][2]);dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);dp[i][2] = dp[i - 1][1] + prices[i];}return Math.max(dp[prices.length - 1][0], dp[prices.length - 1][2]);
}

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

力扣题目链接(opens new window)

给定一个整数数组 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.

注意:

  • 0 < prices.length <= 50000.
  • 0 < prices[i] < 50000.
  • 0 <= fee < 50000.

思路

思路:动态规划
跟买卖股票II相比,每次交易都有手续费。那么递推公式需要加上手续费用
动态规划五部曲
1.dp数组以及下标代表含义
定义二维dp数组dp[i][j] 表示第i天最大利润
j = 0 表示持有股票
j = 1 表示不持有股票2.确定递推公式
手续费可以在买入股票时扣,也可在卖出股票扣。这里采用买入股票时扣手续费
第i天持有股票dp[i][0]
1.前一天持有股票 dp[i-1][0]
2.前一天未持有股票dp[i-1][1] - prices[i]-fee
第i天不持有股票 dp[i][1]
1.前一天持有股票 dp[i-1][0] + prices[i]
2.前一天未持有股票dp[i-1][1]
3.dp数组初始化
dp[0][1] = -prices[0] -fee
4.遍历顺序,dp[i]由dp[i-1]推导,故正序
5.举例推导dp数组
时间复杂度o(n)
空间复杂度o(n)

代码如下

public int maxProfit(int[] prices, int fee) {if (prices == null || prices.length == 0)return 0;int[][] dp = new int[prices.length][2];dp[0][0] = -prices[0] - fee;for (int i = 1; i < prices.length; i++) {dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] - prices[i] - fee);dp[i][1] = Math.max(dp[i - 1][0] + prices[i], dp[i - 1][1]);}return dp[prices.length-1][1];
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云计算任务调度仿真04

这次分享一篇更加高级的云计算任务调度的文章和代码&#xff0c; 基于A3C学习和残差回归神经网络的随机边缘云计算环境动态调度 网络结构 结果 代码示例 这是基于pytorch实现的&#xff0c;所以复现起来没有什么难度&#xff0c;但是可以看到这有六层网络&#xff0c;而且…

KubeSphere 核心实战之一【在kubesphere平台上部署mysql】(实操篇 1/3)

文章目录 1、登录kubesphere平台2、kubesphere部署应用分析2.1、工作负载2.2、服务2.3、应用路由2.4、任务2.5、存储与配置2.6、部署应用三要素 3、部署mysql3.1、mysql容器启动实例3.2、mysql部署分析3.3、创建mysql的配置3.4、创建mysql的数据卷pvc3.5、创建mysql工作负载3.6…

java应用中swagger使用

文章目录 前言使用依赖引入配置注解使用controller中注解实体类注解 页面展示 前言 现在前后端分离式开发&#xff0c;最头疼的部分就是接口文档了。最讨厌两种人&#xff0c;一种是不写接口文档的人&#xff0c;另一种则是让我写接口文档的人。实际上&#xff0c;我们有一款特…

python/c++ Leetcode题解——20. 有效的括号

目录 题解 方法一&#xff1a;栈 复杂度分析 题解 方法一&#xff1a;栈 判断括号的有效性可以使用「栈」这一数据结构来解决。 我们遍历给定的字符串 s。当我们遇到一个左括号时&#xff0c;我们会期望在后续的遍历中&#xff0c;有一个相同类型的右括号将其闭合。由于后…

yolov5_obb win10环境安装

1、项目地址&#xff1a; GitHub - hukaixuan19970627/yolov5_obb: yolov5 csl_label.(Oriented Object Detection)&#xff08;Rotation Detection&#xff09;&#xff08;Rotated BBox&#xff09;基于yolov5的旋转目标检测yolov5 csl_label.(Oriented Object Detection)…

手机与电脑更改IP地址怎么使用代理IP?

在现代互联网时代&#xff0c;代理IP已成为许多人日常生活和工作中不可或缺的一部分。通过代理IP&#xff0c;用户可以隐藏自己的真实IP地址&#xff0c;并获得更好的网络体验。本文将详细介绍如何在手机和电脑上更改IP地址并使用代理IP。 一、手机使用代理IP 1. 打开手机设置&…

微服务接口工具Swagger2

##1、什么是Swagger? # 官网 https://swagger.io/核心功能 生成接口说明文档生成接口测试工具 2、SpringBoot集成Swagger2 1&#xff09;、添加依赖 <!-- swagger2 --><!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --><depen…

XGBoost系列1——XGBoost简介与入门

写在开头 XGBoost&#xff08;eXtreme Gradient Boosting&#xff09;是一种被广泛使用的机器学习算法&#xff0c;由陈天奇博士于2014年提出&#xff0c;以其卓越的性能在数据科学竞赛中备受瞩目。本篇博客将深入探讨XGBoost&#xff0c;从其背景和发展、优势和特点开始&…

[WUSTCTF2020]alison_likes_jojo 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 得到的 flag 请包上 flag{} 提交。 感谢 Iven Huang 师傅供题。 比赛平台&#xff1a;https://ctfgame.w-ais.cn/ 密文&#xff1a; 下载附件解压&#xff0c;得到两张jpg图片和一个文本文件。 解题思路&#x…

[DL]深度学习_Feature Pyramid Network

FPN结构详解 目录 一、概念介绍 二、结构详解 1、对比试验 2、特征图融合 3、结构详解 4、不同尺度预测 5、Proposal映射到预测特征层 一、概念介绍 Feature Pyramid Network (FPN)是一种用于目标检测和语义分割的神经网络架构。它的目标是解决在处理不同尺度的图像时…

使用Visual Leak Detector排查内存泄漏

目录 1、VLD工具概述 2、下载、安装VLD 2.1、下载VLD 2.2、安装VLD 3、VLD安装目录及文件说明

【工业物联网】现代企业环境中的DCS(分布式控制系统)和SCADA(站点控制和数据采集)...

快答案&#xff1a; SCADA和DCS作为单独的系统开始&#xff0c;但一起成长。今天的带宽如此广泛&#xff0c;不需要在每个节点进行本地化。 SCADA和DCS&#xff1a;如果您参与管理企业级网络&#xff0c;您可能已经听说过这些术语。本文将阐明两种技术之间的区别。请注意&#…

pycharm管理仓库(Manager Repository)不见了

经常使用pycharm的大佬们都知道&#xff0c;pycharm中内置了很多库和包&#xff0c;很好用 但是下载来用自带的源很麻烦&#xff0c;于是就用国内的源 可以当我们添加管理仓库的时候&#xff0c;却没有了按钮&#xff0c;如何解决呢&#xff1f; 回到pycharm的主界面&#xf…

漏洞复现--Likeshop任意文件上传(CVE-2024-0352)

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

不是人才用不起,而是AI巡检更有性价比!

在许多行业中&#xff0c;如煤炭、电力、化工等&#xff0c;安全生产是至关重要的。这就需要通过巡检&#xff0c;对设备运行状态进行实时监测&#xff0c;及时发现并处理潜在的安全隐患&#xff0c;从而降低事故发生的概率。但是传统的巡检方式通常依赖于人工进行&#xff0c;…

Docker从入门到精通

系列文章目录 docker常见用法之镜像构建1 docker 系列文章目录一、镜像的分层结构二、容器的用法三、镜像的构建3.1docker commit 构建新镜像三部曲3.1.1运行容器并且修改容器3.1.2提交容器3.1.2删除docker镜像 3.2Dockerfile构建镜像 系列文章目录一、 Dockerfile写法详解1.1…

毛细作用是什么意,请举几个生活中常见的例子。

问题描述&#xff1a;毛细作用是什么意&#xff0c;请举几个生活中常见的例子。 问题解答&#xff1a; 毛细作用是一种液体在细小管道或毛细管中上升或下降的现象&#xff0c;其产生主要是由于表面张力和毛细管内外液体的相互作用。 生活中有许多常见的例子涉及到毛细作用&a…

【数据库和表的管理】

数据库和表的管理 一、实验目的 了解MySQL数据库的逻辑结构和物理结构的特点。学会使用SQL语句创建、选择、删除数据库。学会使用SQL语句创建、修改、删除表。学会使用SQL语句对表进行插入、修改和删除数据操作。了解MySQL的常用数据类型。 二、实验内容SQL语句创建、选择、删…

7 种提升 SpringBoot 吞吐量神技!

7 种提升 SpringBoot 吞吐量神技&#xff01; 1、异步执行2、增加内嵌 Tomcat 的最大连接数3、使用 ComponentScan()4、默认 Tomcat 容器改为 Undertow5、使用 BufferedWriter 进行缓冲6、Deferred 方式实现异步调用7、异步调用可以使用 AsyncHandlerInterceptor 进行拦截 1、异…

[shell]实现多个shell脚本之间变量传递

一、需求 需要有一些变量要从一个shell文件向另一个shell文件传递。 二、方案 2.1通过入参形式传递 当A脚本中的变量需要传递到B脚本中时&#xff0c;可以在运行B脚本的基础上&#xff0c;将A脚本中的数据加入到B脚本的入参中&#xff0c;从而达到传递参数的目的。 2.2通过…