代码随想录算法训练营第四十八天|121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

文档讲解:代码随想录

视频讲解:代码随想录B站账号

状态:看了视频题解和文章解析后做出来了

121. 买卖股票的最佳时机

class Solution:def maxProfit(self, prices: List[int]) -> int:if len(prices) == 0:return 0dp = [[0] * 2 for _ in range(len(prices))]dp[0][0] -= prices[0]for i in range(1, len(prices)):dp[i][0] = max(dp[i-1][0], -prices[i])dp[i][1] = max(dp[i-1][1], prices[i] + dp[i-1][0])return dp[-1][1]
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

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

dp[i][0] : 我当前持有股票的时候所能拥有的最高现金,如果买入的话就是 - price[i]

dp[i][1]:我当前不持有股票所有拥有的最高现金。

2. 确定递推公式

(1)当前持有股票,我觉得这个就是在维护最小的买入价格。所以这个价格要取前一天持有股票时的现金和买入当前股票现金的较小值,就是决定哪一天买入价格最低,把这个最低的价格贯穿整个循环。dp[i][0] = max(dp[i-1][0], -prices[i])

(2)当前不持有股票。两种情况要么是持续上一天的不持有状态,要么是今天把股票卖了。dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i])

3. dp数组的初始化

(1) 第0天持有股票,那肯定是买入,所以初始化为-prices[i]

(2) 第0天不持有股票,那就是什么也没干,初始化为0

4. 遍历顺序

递推公式中有i-1,所以从前往后遍历

5. dp数组举例

 

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

class Solution:def maxProfit(self, prices: List[int]) -> int:length = len(prices)dp = [[0] * 2 for _ in range(length)]dp[0][0] = -prices[0]dp[0][1] = 0for i in range(1, length):dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i]) #注意这里是和121. 买卖股票的最佳时机唯一不同的地方dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i])return dp[-1][1]
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

唯一的区别在于股票可以买卖多次,那么递推公式就有所改变。

改变在于第i天持有股份上

1. 持有昨天也持有的股份,不做任何动作,那现金就是dp[i-1][0]

2. 买入当前的股份,但因为可以多次买入,所以通过前面的买卖可能有利润的,所以要加上昨日不持有股份的利润值。

dp[i-1][1] - prices[i]

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

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

相关文章

学习.NET验证模块FluentValidation的基本用法

开源博客项目Blog .NET中使用FluentValidation验证部分对象实例的属性值,本文学习FluentValidation模块的基本用法,后续再学习Blog .NET项目FluentValidation模块的用法。   FluentValidation模块支持Linq 表达式,同时支持链式操作&#xf…

Ubuntu20.04 安装微信 【优麒麟的镜像源方式安装】

缺点:是网页版本的嵌入,功能少。 推荐wine方式安装:Ubuntu20.04 安装微信 【wine方式安装】推荐 从优麒麟的镜像源安装原生微信 应用下载-优麒麟|Linux 开源操作系统 新建文件software.list sudo vi /etc/apt/sources.list.d/…

操作系统:进程(一)

进程的基本概念 一般的解释是:进程是程序的一个执行实例,是正在执行的程序。我们写的程序编译后是一段二进制的文件。启动的时候加载到系统里面执行,就是以进程的形式执行。也就是说,我们编译后的可执行程序是一个静态的概念&…

【数据结构】树与二叉树(二十):树获取大儿子、大兄弟结点的算法(GFC、GNB)

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语 5.2 二叉树5.3 树5.3.1 树的存储结构1. 理论基础2. 典型实例3. Father链接结构4. 儿子链表链接结构5. 左儿子右兄弟链接结构 5.3.2 获取结点的算法1. 获取大儿子结点的算法(GFC)…

为什么软件公司很少用Python开发Web项目?

实际上,Python在Web开发方面有着广泛的应用,许多软件公司也确实使用Python来开发Web项目。 Python拥有诸如Django、Flask等流行的Web框架,这些框架使得开发者能够迅速、高效地开发出Web应用。 然而,Python在Web开发中的使用可能会…

利用 Pandoc + ChatGPT 优雅地润色论文,并保持 Word 公式格式:Pandoc将Word和LaTeX文件互相转化

论文润色完美解决方案:Pandoc 与 ChatGPT 的强强联合 写在最前面其他说明 一、通过 Pandoc 将 Word 转换为 LaTeX 的完整指南步骤 1: 安装 PandocWindows:macOS:Linux: 步骤 2: 准备 Word 文档步骤 3: 转换文档步骤 4: 检查并调整输出步骤 5: 编译 LaTeX 文档总结 二…

图新地球地图导入操作步骤

1、下载图源,如下: 2、将其全部复制或部分复制,然后回到桌面,打开文件所在位置,如下: 3、将复制的数据粘贴到文件夹下,具体如下: 4、复制到路径如下: 5、复制结果如下&am…

应用场景丨迭代市政综合管廊监测系统建设

市政综合管廊是指在城市地下建造的隧道空间,将市政、电力、通讯、燃气、给排水等各种管线集于一体,实施统一规划、设计、建设和管理。综合管廊有利于解决反复开挖路面、架空线网密集、管线事故频发等问题,是保障城市运行的重要基础设施和“生…

OpenGL 坐标投影与反投影(Qt)

文章目录 一、简介1.1投影1.2反投影二、应用代码三、实现效果参考资料一、简介 在学习OpenGL一段时间之后,我们都会了解坐标的转换过程,如下图所示: 1.1投影 正如图中所述,OpenGL将一个3D坐标投影到一个2D空间主要有以下几个步骤,这也是我们比较熟知的几个步骤: 现实局部…

ElasticSearch快速入门

一、全文检索 1、什么是全文检索 全文索引是一种通过对文本内容进行全面索引和搜索的技术。它可以快速的在大量文本数据中查找包含特定关键词或短语的文档,并返回相关的搜索结果。 全文检索广泛应用于各种信息管理系统和应用中,如搜索引擎、文档管理系…

三十一、W5100S/W5500+RP2040树莓派Pico<TCP_Server多路socket>

文章目录 1 前言2 简介2. 1 使用多路socket的优点2.2 多路socket数据交互原理2.3 多路socket应用场景 3 WIZnet以太网芯片4 多路socket设置示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言 W5100S/W5500是一…

并发编程(多线程)-可见性、有序性、原子性问题

目录 可见性 可见性概念 可见性演示 小结 原子性 原子性概念 原子性演示 小结 有序性 有序性概念 有序性演示 小结 可见性 可见性概念 可见性(Visibility):是指一个线程对共享变量进行修改,另一个先立即得到修改后的…