算法打卡day42

devtools/2024/10/18 20:20:44/

今日任务:

1)121. 买卖股票的最佳时机

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

3)复习day17

121. 买卖股票的最佳时机

题目链接:121. 买卖股票的最佳时机 - 力扣(LeetCode)

给定一个数组 prices,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。示例 1:
输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。示例 2:
输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0。

文章讲解:代码随想录 (programmercarl.com)

视频讲解:动态规划之 LeetCode:121.买卖股票的最佳时机1哔哩哔哩bilibili

思路:

这是一道经典的股票买卖问题,可以通过动态规划来解决。我们可以维护两个变量来记录当前的最低买入价格和最大利润。遍历股票价格数组,对于每一天的股票价格,我们更新最低买入价格和最大利润:

  1. 如果当前股票价格低于最低买入价格,则更新最低买入价格为当前价格;
  2. 否则,计算当前股票价格与最低买入价格之差,更新最大利润为当前利润与已记录的最大利润的较大值。
class Solution:def maxProfit(self, prices: List[int]) -> int:if not prices:return 0# 初始化最低买入价格和最大利润min_price = prices[0]max_profit = 0# 遍历股票价格数组for price in prices[1:]:# 更新最低买入价格min_price = min(min_price, price)# 计算当前利润profit = price - min_price# 更新最大利润max_profit = max(max_profit, profit)return max_profit

 

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

题目链接:122. 买卖股票的最佳时机 II - 力扣(LeetCode)

文章讲解:代码随想录 (programmercarl.com)

视频讲解:动态规划,股票问题第二弹 | LeetCode:122.买卖股票的最佳时机II哔哩哔哩bilibili

思路:

 

我们可以用动态规划来解决这个问题。在这个问题中,我们只关心最终能够获得的利润,而不需要具体的交易路径。因此,我们可以定义两个状态变量:

  1. hold:表示当前持有股票时的最大利润。
  2. not_hold:表示当前不持有股票时的最大利润。

对于每一天,我们有三种操作:

  1. 保持持有状态,即不卖出,这样利润不变。
  2. 卖出股票,这样我们的利润将增加当前股票的价格。
  3. 买入股票,这样我们的利润将减少当前股票的价格。

我们的目标是选择操作使得最终的利润最大化。因此,我们可以通过比较这三种操作的结果来更新状态变量 holdnot_hold

具体步骤如下:

  1. 首先,我们初始化 hold 为负无穷,表示当前不可能持有股票,而 not_hold 为 0,表示当前没有股票,利润为 0。
  2. 然后,我们遍历每一天的股票价格,对于每一天,我们都更新 holdnot_hold
    • 如果选择保持持有状态,即不卖出,则当前持有股票时的最大利润为上一状态的 hold
    • 如果选择卖出股票,则当前不持有股票时的最大利润为上一状态的 hold 加上当前股票价格。
    • 如果选择买入股票,则当前持有股票时的最大利润为上一状态的 not_hold 减去当前股票价格。
  3. 最终,我们返回 not_hold,因为在最后一天,我们希望不持有股票以获取最大利润。
class Solution:def maxProfit(self, prices: List[int]) -> int:if not prices:return 0# 定义状态变量hold = float('-inf')  # 持有股票时的最大利润not_hold = 0           # 不持有股票时的最大利润# 遍历股票价格数组for price in prices:# 计算当前持有股票时的最大利润hold = max(hold, not_hold - price)# 计算当前不持有股票时的最大利润not_hold = max(not_hold, hold + price)return not_hold

注意这里的hold(持有股票),我可以选择继续持有上一个状态的股票,就是继承上一状态的hold,也可以选择在当天持有股票,如果持有当前股票,那么此刻hold上一状态不持有股票的金额-当前股票价钱,比较这两个hold,谁大选择谁

no_hold(不持有股票),我们可以选择卖掉已经持有的股票,那么no_hold上一状态持有股票的金额+当前股票价格,另一种我们可以选择继续继承上一状态的不持有,比较这两个no_hold谁更大

 

 


http://www.ppmy.cn/devtools/34420.html

相关文章

python中的isdecimal函数

在Python中,字符串对象有一个方法叫做 isdecimal()。这个方法用于检查字符串中的所有字符是否都是十进制数字(0-9)。如果字符串中的所有字符都是十进制数字,并且字符串至少包含一个字符,那么 isdecimal() 方法将返回 T…

STM32单片机实战开发笔记-独立看门狗IWDG

嵌入式单片机开发实战例程合集: 链接:https://pan.baidu.com/s/11av8rV45dtHO0EHf8e_Q0Q?pwd28ab 提取码:28ab IWDG模块测试 1、功能描述 STM32F10X内置两个看门狗,提供了更高的安全性,时间的精确下性和使用的灵活性…

Notion 风格所见即所得编辑器:AI 自动补全 | 开源日报 No.245

steven-tey/novel Stars: 10.8k License: Apache-2.0 novel 是一个类似 Notion 风格的所见即所得编辑器,具有 AI 助力自动补全功能。 支持 Notion 风格的 WYSIWYG 编辑基于 AI 的自动补全功能可以在 React 项目中使用 novel NPM 包提供了一系列可配置的编辑器组件…

局域网唤醒平台:UpSnap

简介:UpSnap是一个简单的唤醒局域网网络应用程序。UpSnap为每个用户、每个设备提供了唯一的访问权限。虽然管理员拥有所有权限,但他们可以为用户分配特定的权限,如显示/隐藏设备、访问设备编辑、删除和打开/关闭设备电源。 历史攻略&#xf…

深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作

码到三十五 : 个人主页 OceanBase与MySQL模式下兼容性序 在当今的大数据时代,数据库技术的选择对于企业的信息化发展至关重要。OceanBase作为一种高性能、高可用的分布式关系数据库,在与MySQL模式的兼容性方面展现出了显著的优势&#xff0c…

Kotlin基础知识总结(三万字超详细)

1、条件语句 (1)if条件 if条件表达式,每一个分支最后一条语句就是该分支的返回值。适用于每个分支返回值类型一致这种情况。 fun getDegree(score: Int): String{val result: String if(score 100){"非常优秀"}else if(score …

Vue踩坑,less与less-loader安装,版本不一致

无脑通过npm i less -D安装less之后,继续无脑通过npm i less-loader -D安装less-loader出现如下错误: 解决方法: 1) npm uninstall less与 npm uninstall less-loader 2) 直接对其版本: npm i less3.0.4 -D npm i less-loader…

Redis能保证数据不丢失吗?

大家即使没用过Redis,也应该都听说过Redis的威名。 Redis是一种Nosql类型的数据存储,全称Remote Dictionary Server,也就是远程字典服务器,用过Dictionary的应该都知道它是一种键值对(Key-Value)的数据结构…