当前位置: 首页 > news >正文

算法学习day51

算法学习day51

  • 1.力扣309.最佳买卖股票时机含冷冻期
    • 1.1 题目描述
    • 1.2分析
    • 1.3 代码
  • 2.力扣714.买卖股票的最佳时机含手续费
    • 2.1 题目描述
    • 2.2 分析
    • 2.3 代码
  • 3.参考资料

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

1.1 题目描述

题目描述

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

设计一个算法求最大利润。在满足以下约束条件下,尽可能多的完成交易:

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

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

例:

输入:[1,2,3,0,2]

输出:3

解释:对应的交易状态为:[买入,卖出,冷冻期,买入,卖出]

1.2分析

动规五部曲

1.确定dp数组以及下标的含义

dp[i] [j]:第i天状态为j,所剩的最多现金为dp[i] [j]

dp[i] [0]: 持有股票(今天买入股票,或者之前买入后没有操作了,一直持有)

dp[i] [1]:保持卖出股票的状态(度过了冷冻起之后,一直没有操作)

dp[i] [2]:今天卖出股票

dp[i] [3]: 今天为冷冻期,但冷冻期状态不可持续

2.确定递推公式

dp[i] [0]: 持有股票(今天买入股票,或者之前买入后没有操作了,一直持有)

(1)前一天持有股票的状态,dp[i] [0] = dp[i - 1] [0]

(2)今天买入:

​ (2.1)前一天是冷冻期,然后今天买入,dp[i - 1] [3] - prices[i]

​ (2.2)前一天保持卖出股票状态,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])

**dp[i] [1]:**保持卖出股票的状态(度过了冷冻起之后,一直没有操作)

(1) 前一天就卖出股票了

(2) 前一天是冷冻期

递推公式: dp[i] [1] = max(dp[i - 1] [1], dp[i - 1] [3])

**dp[i] [2]:**今天卖出股票

今天卖出,说明昨天一定持有

递推公式:dp[i] [2] = dp[i - 1] [0] + prices[i]

dp[i] [3]: 今天为冷冻期,但冷冻期状态不可持续

到达冷淡期,说明昨天卖出了股票

递推公式:dp[i] [3] = dp[i - 1] [2]

dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3], 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];

3.dp数组如何初始化

dp[0] [0] = -prices[0]

dp[0] [1] = 0

dp[0] [2] = 0

dp[0] [3] = 0

4.确定遍历顺序

显然从前往后遍历

5.举例推导dp数组
在这里插入图片描述

1.3 代码

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)); // 创建一个 n 行 4 列的二维数组 dp,用于记录各个状态下的最大收益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])); }
};

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

2.1 题目描述

题目描述:

给定一个整数数组prices , 其中第i个元素代表了第i天的股票价格;非负整数fee代表了交易的手续费。

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

返回获得利润的最大值。

例:

输入: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.2 分析

dp[i] [0] 表示第i天持有股票所省最多现金。dp[i] [1] 表示第i天不持有股票所得最多现金

1.dp[i] [0] 表示第i天持有股票所省最多现金由以下状态推导出来:

(1) 第i -1 就持有股票,保持现状,所得现金就是昨天持有股票所得现金,dp[i- 1] [0]

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

递推公式:dp[i] [0] = max(dp[i-1] [0], dp[i - 1] [1] - prices[i])

2.dp[i] [1] 表示第i天不持有股票所得最多现金

(1)如果第i -1 就不持有股票,保持现状,所得现金就是昨天不持有股票的现金,dp[i-1] [1]

(2) 第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金,需要手续费,dp[i - 1] [0] + prices[i] - fee

递推公式:dp[ i ] [1] = max(dp[i - 1] [1] , dp[ i- 1] [0] + prices[i] - fee)

2.3 代码

class Solution {
public:int maxProfit(vector<int>& prices, int fee) {int n = prices.size();// 定义 dp 数组,dp[i][0/1] 表示第 i 天结束时,// 持有股票/不持有股票的最大收益vector<vector<int>> dp(n, vector<int>(2, 0));dp[0][0] -= prices[0]; // 第一天持股,花费 prices[0] 的成本for (int i = 1; i < n; i++) {// 第 i 天结束时持有股票的最大收益分两种情况:// 1. 前一天也持有股票,今天不进行任何操作,所以今天的最大收益就是昨天的最大收益// 2. 前一天不持有股票,今天买入股票,所以今天的最大收益就是前一天不持有股票时的最大收益减去今天的股票价格dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);// 第 i 天结束时不持有股票的最大收益也分两种情况:// 1. 前一天也不持有股票,今天不进行任何操作,所以今天的最大收益就是昨天的最大收益// 2. 前一天持有股票,今天卖出股票,所以今天的最大收益就是前一天持有股票时的最大收益加上今天的股票价格减去手续费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]);}
};

3.参考资料

[代码随想录]

相关文章:

算法学习day51

算法学习day511.力扣309.最佳买卖股票时机含冷冻期1.1 题目描述1.2分析1.3 代码2.力扣714.买卖股票的最佳时机含手续费2.1 题目描述2.2 分析2.3 代码3.参考资料1.力扣309.最佳买卖股票时机含冷冻期 1.1 题目描述 题目描述 给定一个整数数组&#xff0c;其中第i个元素代表了第…...

10 JS01——初识JS

目标&#xff1a; 1、初识JavaScript 2、JavaScript注释 3、JavaScript输入输出语句 一、初识JavaScript 1、JavaScript是什么 JavaScript是世界上最流行的语言之一&#xff0c;是一种运行在客户端的脚本语言(Script是脚本的意思) 脚本语言:不需要编译&#xff0c;运行过程…...

【软考备考-综合知识】安全性、可靠性与系统性能评测基础知识

计算机的安全性 安全等级 计算机系统中的三类安全性是指技术安全性、管理安全性和政策法律安全性。 信息安全五要素 机密性&#xff1a;全包信息不暴露给未授权的实体或进程。 完整性&#xff1a;只有得到允许的人才能够修改数据&#xff0c;并能够判别出数据是否已被篡改。…...

匆忙之间难免疏忽,写代码更加如此

一个方法包含了多个知识点的合计&#xff0c;合计起来用。实战开发特点1&#xff1b; 基础知识点不牢固&#xff0c;您必定就会感觉寸步难行啊 public class AddJiChuShu{int a 1;int b 2;int c 0;int d 0;string str "";string str2 "张三";//mothe…...

低代码(七)低代码平台后端技术选型2.0

JWT 登录token Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准&#xff08;(RFC 7519).该token被设计为紧凑且安全的&#xff0c;特别适用于分布式站点的单点登录&#xff08;SSO&#xff09;场景。JWT的声明一般被用来在身份提供者和服…...

UDS介绍

首先要有网络网络七层的概念&#xff1a; 学习链接&#xff1a; 七层网络模型-CSDN博客 UDS网络层/TP层&#xff08;ISO 15765-2&#xff09;的解读 - 知乎 (zhihu.com) 概念&#xff1a; UDS&#xff08;Unified Diagnostic Services&#xff0c;统一的诊断服务。 标准名是《…...

ASP.NET Core MVC 从入门到精通之初窥门径

随着技术的发展&#xff0c;ASP.NET Core MVC也推出了好长时间&#xff0c;经过不断的版本更新迭代&#xff0c;已经越来越完善&#xff0c;本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容&#xff0c;适用于初学者&#xff0c;在校毕业生&#xff0c…...

英码科技智慧环卫:构建宜居城市新篇章

随着城市化进程的加快&#xff0c;城市环境卫生问题日益凸显。如何提高城市环境卫生管理水平&#xff0c;提升城市品质&#xff0c;成为了各级政府和社会各界关注的焦点。智慧环卫作为一种结合现代信息技术的环境卫生管理方式&#xff0c;正在逐渐成为解决城市环境卫生问题的有…...

在Spring Boot微服务使用HashOperations操作Redis Hash哈希散列

记录&#xff1a;403 场景&#xff1a;在Spring Boot微服务使用RedisTemplate的HashOperations操作Redis Hash哈希散列。 版本&#xff1a;JDK 1.8,Spring Boot 2.6.3,redis-6.2.5 1.微服务中Redis配置信息 1.1在application.yml中Redis配置信息 spring:redis:host: 192.1…...

innobackupex备份mysql产生returned OS error 124

解决使用innobackupex备份mysql产生returned OS error 124 xtrabackup 报错Too many open files 故障处理 一、背景 客户反馈数据库备份失败。 二、环境描述 [rootmes-node1 ~]# mysql -V mysql Ver 14.14 Distrib 5.7.24, for Linux (x86_64) using EditLine wrapper [root…...

明明有index.jsp文件访问的时候却显示404

重建一下项目...

人工智能前沿——「全域全知全能」人类新宇宙ChatGPT

&#x1f680;&#x1f680;&#x1f680;OpenAI聊天机器人ChatGPT——「全域全知全能」人类全宇宙大爆炸&#xff01;&#xff01;&#x1f525;&#x1f525;&#x1f525; 一、什么是ChatGPT?&#x1f340;&#x1f340; ChatGPT是生成型预训练变换模型&#xff08;Chat G…...

eslint-plugin-import - import/order

eslint-plugin-import是什么&#xff1f; 该插件目的在于支持ES6以上的导入/导出语法&#xff0c;并防止文件路径和导入名称拼写错误的问题。 import/order是什么&#xff1f; 按照约定的规则对引入的模块进行排序。 import/order常用规则介绍 groups 约定引入模块顺序的…...

selenium知识点大全

selenium知识点大全 在使用selenium之前必须先配置浏览器对应版本的webdriver。 1. 初始化浏览器对象 from selenium.webdriver import Chrome# 创建浏览器对象&#xff0c;并且打开一个空的页面 browser Chrome()# 关闭浏览器 browser.close()2. 访问指定网页 from selen…...

Biotin-PEG-SH生物素-聚乙二醇-巯基结构式;SH-PEG-Biotin

Biotin-PEG-SH 生物素-聚乙二醇-巯基 中文名称&#xff1a;生物素-聚乙二醇-巯基 英文名称&#xff1a;Biotin-PEG-SH Biotin-PEG-Thiol 性状&#xff1a;粘稠液体或者固体粉末&#xff0c;取决于分子量 溶剂&#xff1a;溶于水和DCM、DMF等大部分有机溶剂 分子式&#x…...

【防止恶意用户注册】-- 手机在网状态 API 的防欺诈应用解析

简介 手机在网状态 API 支持传入手机号码&#xff0c;查询手机号在网状态&#xff0c;返回在网、在网不可用、不在网&#xff08;销号/未启用/停机&#xff09;等多种状态&#xff0c;查询手机号在网状态之后&#xff0c;可以根据具体的业务需求来进行不同的处理。 本文主要介…...

Python json 数据提取 jsonpath 详解

一、JsonPath JsonPath 是一种信息抽取类库&#xff0c;是从JSON文档中抽取指定信息的工具&#xff0c;提供多种语言实现版本&#xff0c;包括&#xff1a;Javascript, Python&#xff0c; PHP 和 Java。也就是独立的可以配合多种语言进行匹配的目标值的一种类库&#xff0c;和…...

TCP和UDP的区别以及应用场景

区别 首先UDP协议非常简单&#xff0c;头部只有8个字节&#xff1a; 校验和为了提供可靠的UDP首部和数据而设计&#xff0c;防止收到在网络传输中受损的UDP包。 再对比下TCP协议&#xff1a; 传输层有两个传输协议分别是 TCP 和 UDP&#xff0c;在内核中是两个完全独立的软件…...

高铁轮毂表面缺陷的<视觉显著性>超像素图像检测方法

内容:提出一种基于视觉显著性注意机制的超像素自适应检测方法&#xff1b; 设计视觉显著性注意机制滤波器用于粗略定位出缺陷空间范围&#xff0c;结合超像素分块图像分割方法消除光照不均匀引起的噪声干扰&#xff0c;有效地完成缺陷区域的边界分割和实时特征提取&…...

纺织工业库房如何有效防潮?恒温恒湿真的有效吗?

纺织工业库房中的设备或存放的货物对温度或湿度的变化又非常敏感&#xff0c;温度或湿度的波动可能会产生一些问题。 针对库房环境温湿度的监测&#xff0c;若采用人工检测的方式&#xff0c;很难管控精准且工作效率低&#xff1b;其次&#xff0c;人工综合成本高。那么该如何实…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...

rm视觉学习1-自瞄部分

首先先感谢中南大学的开源&#xff0c;提供了很全面的思路&#xff0c;减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接&#xff1a;https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架&#xff1a; 代码框架结构&#xff1a;readme有…...

EEG-fNIRS联合成像在跨频率耦合研究中的创新应用

摘要 神经影像技术对医学科学产生了深远的影响&#xff0c;推动了许多神经系统疾病研究的进展并改善了其诊断方法。在此背景下&#xff0c;基于神经血管耦合现象的多模态神经影像方法&#xff0c;通过融合各自优势来提供有关大脑皮层神经活动的互补信息。在这里&#xff0c;本研…...