算法练习11——买卖股票的最佳时机 II

122. 买卖股票的最佳时机 II

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。

问题转换 + 贪心

只要明天比今天价格高就在今天买入明天卖出,吃掉所有收益一定能达成题意要求的收益

class Solution:def maxProfit(self, prices: List[int]) -> int:res = 0if len(prices) == 1:return resfor i in range(1, len(prices)):tmp = prices[i] - prices[i - 1]res += (tmp if tmp > 0 else 0)return res

动态规划

下面网友写的题解十分精彩,从状态转移方程可以看出计算i只需i-1,可以进行滚动优化

作者:liweiwei1419
链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/solutions/38498/tan-xin-suan-fa-by-liweiwei1419-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

第 1 步:定义状态

状态 dp[i][j] 定义如下:

dp[i][j] 表示到下标为 i 的这一天,持股状态为 j 时,我们手上拥有的最大现金数。

注意:限定持股状态为 j 是为了方便推导状态转移方程,这样的做法满足 无后效性。

其中:

第一维 i 表示下标为 i 的那一天( 具有前缀性质,即考虑了之前天数的交易 );
第二维 j 表示下标为 i 的那一天是持有股票,还是持有现金。这里 0 表示持有现金(cash),1 表示持有股票(stock)。

第 2 步:思考状态转移方程

状态从持有现金(cash)开始,到最后一天我们关心的状态依然是持有现金(cash);
每一天状态可以转移,也可以不动。状态转移用下图表示:
在这里插入图片描述
(状态转移方程写在代码中)

说明:

由于不限制交易次数,除了最后一天,每一天的状态可能不变化,也可能转移;
写代码的时候,可以不用对最后一天单独处理,输出最后一天,状态为 0 的时候的值即可。

第 3 步:确定初始值

起始的时候:

如果什么都不做,dp[0][0] = 0;
如果持有股票,当前拥有的现金数是当天股价的相反数,即 dp[0][1] = -prices[i];

第 4 步:确定输出值

终止的时候,上面也分析了,输出 dp[len - 1][0],因为一定有 dp[len - 1][0] > dp[len - 1][1]。

public class Solution {public int maxProfit(int[] prices) {int len = prices.length;if (len < 2) {return 0;}// 0:持有现金// 1:持有股票// 状态转移:0 → 1 → 0 → 1 → 0 → 1 → 0int[][] dp = new int[len][2];dp[0][0] = 0;dp[0][1] = -prices[0];for (int i = 1; i < len; i++) {// 这两行调换顺序也是可以的dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]);dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);}return dp[len - 1][0];}
}

复杂度分析:

时间复杂度:O(N),这里 N 表示股价数组的长度;
空间复杂度:O(N),虽然是二维数组,但是第二维是常数,与问题规模无关。

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

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

相关文章

运维知识点汇总

一.公共基础 linux常用目录 链接一 链接二 linux系统启动 链接一 链接二 LVM 链接一 磁盘挂载 链接一 文件权限 链接一 二.VLAN详解 链接 三.中间件 单体部署&#xff1a; 优点&#xff1a; &#xff08;1&#xff09;小团队成型即可完成开发-测试-上线&am…

11.宝塔搭建服务器部署环境

文章目录 安装docker安装宝塔安装mysql安装redisjava环境 安装docker 安装宝塔 运维的好处 安装映射方便 安装mysql 安装redis java环境 nohup java -jar admin.jar &

简单实现接口自动化测试(基于python+unittest)

简介 本文通过从Postman获取基本的接口测试Code简单的接口测试入手&#xff0c;一步步调整优化接口调用&#xff0c;以及增加基本的结果判断&#xff0c;讲解Python自带的Unittest框架调用&#xff0c;期望各位可以通过本文对接口自动化测试有一个大致的了解。 引言 为什么要…

C++实现高性能内存池(二)

文章目录 一、设计内存池二、实现MemoryPool::construct() 实现MemoryPool::deallocate() 实现MemoryPool::~MemoryPool() 实现MemoryPool::allocate() 实现三、与 std::vector 的性能对比一、设计内存池 在上节中,我们在模板链表栈中使用了默认构造器来管理栈操作中的元素内…

MQ - 40 连接器:以MQ Connector为核心搭建数据集成架构的方案设计

文章目录 导图Pre概述连接器是什么数据集成和连接器典型场景: 将 MySQL 中的数据实时同步到 Elasticsearch方案一 使用典型数据集成组件方案二 消息队列连接器方案对比消息队列连接器底层原理分析分布式任务调度平台源 / 目标连接器简单的数据清洗能力Apache Kafka Connector系…

软件行业与就业(导师主讲)

在企业软件应用的整体架构体系中&#xff0c;有一部分被称为中间件&#xff0c;那么什么叫中间件&#xff1f; 中间件&#xff08;Middleware&#xff09;是指位于操作系统和应用程序之间的一层软件层&#xff0c;它提供了一组工具和服务&#xff0c;用于简化和增强企业软件应用…

C++中public、protected及private用法

C中public&#xff0c;protected&#xff0c;private以及它们在继承中表示的一些访问范围&#xff0c;很容易搞糊涂。今天本文就来十分分析一下C中public、protected及private用法。 这里我们首先要明白下面几点。 1.类的一个特征就是封装&#xff0c;public和private作用就是…

Sentinel入门

文章目录 初始Sentinel雪崩问题服务保护技术对比认识Sentinel微服务整合Sentinel 限流规则快速入门流控模式关联模式链路模式 流控效果warm up排队等待 热点参数限流全局参数限流热点参数限流 隔离和降级FeignClient整合Sentinel线程隔离熔断降级慢调用异常比例、异常数 授权规…

redis 6.0.5 linux详细安装步骤和测试

1.从官网下载redis-6.0.5.tar.gz https://download.redis.io/releases/ 2.使用root创建redis用户和目录 [roott3-dtpoc-dtpoc-web06 home]# useradd -d /home/redis -m redis 使用redis用户创建redis目录包括 data logs conf文件夹 [roott3-dtpoc-dtpoc-web06 home]# su - …

rustlings本地开发环境配置

克隆自己的仓库 首先我们要在github上找到自己仓库并把它克隆到本地 git clone https://github.com/LearningOS/rust-rustlings-2023-autumn-******.git下载插件 rust-analyzer和Git Graph一个可以用来解析rust代码&#xff0c;另一个可以可视化管理git代码库 下载rustling…

HTML5+CSS3+JS小实例:仿优酷视频轮播图

实例:仿优酷视频轮播图 技术栈:HTML+CSS+JS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=&quo…

网络安全(骇客)—技术学习

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟入…

2023 Shandong Provincial Collegiate Programming Contest

D. Fast and Fat&#xff08;2023 ICPC 山东省赛&#xff09;&#xff08;二分贪心检查&#xff09; 题意&#xff1a; 对于一个运动员 i &#xff0c;他的速度是 vi&#xff0c;体重是 wi。如果运动员 j 的体重 wj < wi&#xff0c;那么运动员 i 可以用原本的速度 vi 背着…

深入篇【C++】总结<lambda表达式>与<包装器和bind>的使用与意义

深入篇【C】总结&#xff1c;lambda表达式&#xff1e;与&#xff1c;包装器和bind&#xff1e;的使用与意义 一.lambda表达式1.使用语法2.底层本质3.应用意义 二.包装器(适配器)1.使用语法2.解决问题①3.解决问题②4.应用场景:指令操作 三.bind (适配器)1.调整参数位置2.绑定参…

C# Windows 窗体控件中的边距和填充

可以将 Margin 属性、Left、Top、Right、Bottom 的每个方面设置为不同的值&#xff0c;也可以使用 All 属性将它们全部设置为相同的值。 在代码中设置Margin&#xff0c;元素的左边设置为5个单位、上边设置为10个单位、右边设置为15个单位和下边设置为20个单位。 TextBox myT…

【gitlab】本地项目上传gitlab

需求描述 解决方法 下面的截图是gitlab空项目的描述 上传一个本地项目按其中“Push an existing folder”命令即可。 以renren-fast项目为例 # 用git bash 下载renren-fast项目 git clone https://gitee.com/renrenio/renren-fast.git# 在renren-fast的所属目录 打开git ba…

1.1 Joyvan的矩阵

算法设计与分析 1.1 Joyvan的矩阵 题目描述 Joyvan有一个大小为n * m的矩阵&#xff0c;现在他要对矩阵进行q次操作&#xff0c;操作分为如下三种&#xff1a; 0 x y&#xff1a;交换矩阵的x、y两行。 1 x y&#xff1a;交换矩阵的x、y两列。 2 x y&#xff1a;求当前矩阵第…

【数据结构与算法】如何对快速排序进行细节优化以及实现非递归版本的快速排序?

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;国庆长假结束了&#xff0c;无论是工作还是学习都该回到正轨上来了&#xff0c;从今天开始恢复正常的更新频率&#xff0c;今天为大家带来的内容…

【Python_PySide2学习笔记(十八)】勾选按钮QCheckBox类的基本用法

勾选按钮QCheckBox类的基本用法 前言正文1、创建勾选按钮2、勾选按钮获取选中状态3、创建按钮组4、按钮组添加勾选按钮5、按钮组设置单选6、按钮组信号&#xff1a;选中状态改变7、按钮组获取所有勾选按钮7.1、获取勾选按钮对象7.2、获取勾选按钮文本7.3、获取勾选按钮ID7.4、按…

win11安装IIS步骤-已验证23.10.10

IIS服务使用 步骤一&#xff1a;打开控制面板 通过 控制面板— 程序— 启用或关闭Windows功能 — 选择Internet Information Services默认安装IIS&#xff0c;如下图步骤所示 步骤二&#xff1a;打开IIS服务 建议根据下图勾选&#xff0c;建议全选安装&#xff0c;以便后续发…