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

【121. 买卖股票的最佳时机】——贪心算法/动态规划

121. 买卖股票的最佳时机

一、题目难度

简单

三、题目描述

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

五、提示

  1. 1 <= prices.length <= 105
  2. 0 <= prices[i] <= 104

六、贪心算法求解思路

(一)整体思路

我们的目标是通过一次买入和一次卖出操作来获取最大利润。贪心算法的思路就是在遍历股票价格数组的过程中,始终记录当前已经出现过的最低买入价格,然后用当前价格减去这个最低买入价格,得到当前可能的最大利润,不断更新这个最大利润值,直到遍历完整个数组。

(二)贪心思路

贪心算法一般步骤的分析:

1. 将问题分解为若干个子问题

  • 分析
    在本题中,可以将整个股票交易过程按每一天来看作一个子问题。每一天我们都面临一个决策:是否更新最低买入价格以及基于当前价格和最低买入价格计算可能的最大利润。通过依次处理每一天的情况,最终汇总得到整个交易周期内的最大利润,所以整个问题可以分解为按天来考虑的一系列子问题。
  • 初始化变量
    • min_price 为一个较大的值(可以初始化为 prices[0],因为后续会不断更新它为更小的值),它用来记录到目前为止出现过的最低买入价格。
    • max_profit0,它用来记录到目前为止能获取到的最大利润。

2. 找出适合的贪心策略

  • 分析
    贪心策略就是在遍历股票价格数组的过程中,始终保持记录到当前为止所出现过的最低买入价格。因为我们希望买入价格尽可能低,这样在后续任何一天卖出时,才有可能获得最大的利润。所以,每到一天,就比较当天的股票价格和已记录的最低买入价格,如果当天价格更低,就更新最低买入价格,这就是我们确定的贪心策略。

3. 求解每一个子问题的最优解

  • 分析
    对于每一天这个子问题,其最优解就是基于当前已经确定的最低买入价格(通过前面的贪心策略不断更新得到),计算当天卖出能获得的最大利润。即通过当天的股票价格减去最低买入价格得到一个差值,如果这个差值大于之前记录的最大利润,就更新最大利润值。
  • 遍历数组
    • 从数组的第二个元素(索引为 1)开始遍历 prices 数组,因为第一个元素已经作为初始的 min_price 考虑过了。
    • 对于每个元素 prices[i]
      • 首先更新 min_price:比较当前元素 prices[i]min_price,如果 prices[i] 小于 min_price,则将 min_price 更新为 prices[i]。这一步是为了始终记录到目前为止出现过的最低买入价格。
      • 然后更新 max_profit:计算当前价格 prices[i] 减去 min_price 的差值,得到当前可能的最大利润,将这个差值与 max_profit 进行比较,如果差值大于 max_profit,则将 max_profit 更新为这个差值。这一步是为了不断更新能获取到的最大利润值。

4. 将局部最优解堆叠成全局最优解

  • 分析
    在遍历完整个数组后,最后记录下来的最大利润值就是全局最优解。因为在每一天我们都通过贪心策略找到了当天基于最低买入价格能获得的最大利润(局部最优解),随着遍历的进行,不断更新这个最大利润值,最终这个值就代表了在整个交易周期内能够获得的最大利润,也就是将每一天的局部最优解堆叠起来形成了全局最优解。
  • 返回结果
    • 遍历完整个数组后,max_profit 中存储的就是通过一次买入和一次卖出操作所能获取到的最大利润,直接返回 max_profit 即可。

代码对应解释

def maxProfit(prices):if not prices:return 0min_price = prices[0]  # 初始化最低买入价格为第一天的价格max_profit = 0  # 初始化最大利润为0# 以下循环对应处理每一天的子问题for price in prices[1:]:# 对应找出适合的贪心策略步骤,更新最低买入价格if price < min_price:min_price = priceprofit = price - min_price  # 计算当天基于当前最低买入价格的利润# 对应求解每一个子问题的最优解步骤,更新最大利润if profit > max_profit:max_profit = profitreturn max_profit
class Solution:def maxProfit(self, prices: List[int]) -> int:# 特殊情况:空集if not prices:return 0# 正常情况,初始化min_price = prices[0]  # 初始化当前最低买入价格为prices[0]max_profit = 0         # 初始化最大利润为0    # 从索引1(实际2)开始循环遍历股票数组,直接遍历price值# 循环处理每一天的子问题for price in prices[1:]:# 更新当前min_price = min(price, min_price)cur_profit = price - min_pricemax_profit = max(max_profit, cur_profit)return max_profit

在上述代码中:

  • 首先判断输入的数组是否为空,如果为空则返回 0
  • 接着初始化 min_pricemax_profit
  • 然后通过循环遍历数组,在循环中不断更新 min_pricemax_profit
  • 最后返回 max_profit,它就是所能获取到的最大利润。

动态规划解法

  • 思路:通过定义状态与状态转移方程解决问题
    • dp[i]定义为第i天卖出股票所能获得的利润
    • dp[i] = max(dp[i - 1], prices[i] - min_price)是状态方程
    • 其中,min_price是第i天之前(包括第i天)的最低股票购入价格
  • 代码步骤:
    • 特解:空集
    • 初始化:
      • 收入数组dp:一维dp[i],长len(prices),所有值为0
      • 最低买入价格min_price = prices[0]
    • 循环遍历数组:(从第二天索引1开始)
      • 首先更新最低买入价格
      • dp[i] = max(dp[i - 1], prices[i] - min_price
      • 返回最后一个dp[-1]
  • 复杂度分析:
    • 时间复杂度:一次循环遍历,每次循环执行的都是比较和赋值,故 O ( n ) O(n) O(n)
    • 空间复杂度:用到长度n的数组dp存储中间状态,故 O ( n ) O(n) O(n)
def maxProfit(prices):if not prices:return 0n = len(prices)dp = [0] * nmin_price = prices[0]for i in range(1, n):if prices[i] < min_price:min_price = prices[i]dp[i] = max(dp[i - 1], prices[i] - min_price)return dp[-1]

相关文章:

【121. 买卖股票的最佳时机】——贪心算法/动态规划

121. 买卖股票的最佳时机 一、题目难度 简单 三、题目描述 给定一个数组 prices&#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择某一天买入这只股票&#xff0c;并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获…...

LLMs之Calculate:利用大语言模型技术基于文本内容实现数字计算能力的简介、常用方法、代码实现之详细攻略

LLMs之Calculate:利用大语言模型技术基于文本内容实现数字计算能力的简介、常用方法、代码实现之详细攻略 导读:在基于大语言模型(LLM)技术实现数字计算能力的背景下,文本内容的理解和计算过程涉及多个领域的交叉技术,包括自然语言处理(NLP)、机器学习、以及数值计算。…...

LeetCode题练习与总结:判断子序列--392

一、题目描述 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcde"的一…...

json数据结构的转换

# json可用于赌徒与原件数据的转换&#xff08;json以字符串的形式储存数据&#xff0c;在通过json进行两种语言的转换时&#xff0c;应先将数据类型转换成列表或字典&#xff0c;再由列表或字典转换成json字符串&#xff0c;最后由json字符串转换成另一种语言的列表或字典数据…...

mysql删除语句:@Update(“TRUNCATE TABLE employee“)讲解

这个 SQL 语句&#xff1a; TRUNCATE TABLE employee是一个 SQL DDL&#xff08;数据定义语言&#xff09; 操作&#xff0c;用于清空数据库表中的所有记录&#xff0c;但不会删除表结构&#xff08;即列和索引等&#xff09;。 逐部分解释&#xff1a; TRUNCATE&#xff1a;…...

如何修改浏览器指纹?

网络安全日益重要&#xff0c;我们的上网行为变得越来越容易被追踪和分析。其中&#xff0c;浏览器指纹就是一种强大的技术手段&#xff0c;它可以说是你上网的身份象征。 一、浏览器指纹是什么 浏览器指纹是网站和在线平台用来收集关于你的浏览器、设备和网络的详细信息的一…...

实现3D热力图

实现思路 首先是需要用canvas绘制一个2D的热力图&#xff0c;如果你还不会&#xff0c;请看json绘制热力图。使用Threejs中的canvas贴图&#xff0c;将贴图贴在PlaneGeometry平面上。使用着色器材质&#xff0c;更具json中的数据让平面模型 拔地而起。使用Threejs内置的TWEEN&…...

GEE ui界面实现:用户自画多边形, 按面积比例在多边形中自动生成样点,导出多边形和样点shp,以及删除上一组多边形和样点(有视频效果展示)

零、背景 这几天在选样点&#xff0c;发现GEE有强大的ui功能&#xff0c;于是应用在我的工作上。 下述代码实现了几个功能&#xff1a; ①用户可以自己勾勒多边形&#xff0c;随后程序会按面积比例在多边形中自动生成样点&#xff0c;同时根据改多边形的区域生成区域平均月N…...

React diff算法和Vue diff算法的主要区别

React和Vue都是流行的前端框架&#xff0c;它们各自实现了diff算法来优化虚拟DOM的更新过程。以下是React diff算法和Vue diff算法的主要区别&#xff1a; 1. diff策略 React diff算法&#xff1a; React的diff算法主要采用了同层级比较的策略&#xff0c;即它不会跨层级比较节…...

WSL 2 中 FastReport 与 FastCube 的设置方法与优化策略

软件开发人员长期以来一直在思考这个问题&#xff1a;“我们如何才能直接在 Windows 中运行 Linux 应用程序&#xff0c;而无需使用单独的虚拟机&#xff1f;” WSL 技术为这个问题提供了一个可能的答案。WSL 的历史始于 2016 年。当时&#xff0c;其实现涉及使用 Windows 内核…...

《线性代数》学习笔记

列向量无关 上个星期继续学线性代数&#xff0c;一个矩阵&#xff0c;如何判断它是的列向量有几个是线性无关呢&#xff1f;其实有好几个方法。第一个就是一个一个判断。 先选定一个&#xff0c;然后看下这两个&#xff0c;怎么看呢&#xff1f;如果两个列向量线性相关&#…...

Redis三种集群模式:主从模式、哨兵模式和Cluster模式

目录标题 1、背景及介绍2、 Redis 主从复制2.1、主从复制特点2.2、Redis主从复制原理2.3 PSYNC 工作原理2.3.1、启动或重连判断&#xff1a;2.3.2、第一次同步处理&#xff1a;2.3.3、断线重连处理&#xff1a;2.3.4、主节点响应2.3.5、全量同步触发条件&#xff1a;2.3.6、复制…...

CDH大数据平台部署

二、CDH简介 全称Cloudera’s Distribution Including Apache Hadoop。 hadoop的版本 (Apache、CDH、Hotonworks版本) 在公司中一般使用cdh多一些&#xff08;收费的&#xff09;、也有公司使用阿里云大数据平台、微软的大数据平台。 国内也有一些平台&#xff1a;星环大数…...

7.4、实验四:RIPv2 认证和触发式更新

源文件 一、引言&#xff1a;为什么要认证和采用触发式更新&#xff1f; 1. RIP v2 认证 RIP&#xff08;Routing Information Protocol&#xff09;版本 2 添加了认证功能&#xff0c;以提高网络的安全性。认证的作用主要包括以下几点&#xff1a; 防止路由欺骗 RIP v1 是不…...

【一步步开发AI运动小程序】二十一、如果将AI运动项目配置持久化到后端?

**说明&#xff1a;**本文所涉及的AI运动识别、计时、计数能力&#xff0c;都是基于云智「Ai运动识别引擎」实现。云智「Ai运动识别」插件识别引擎&#xff0c;可以为您的小程序或Uni APP赋于原生、本地、广覆盖、高性能的人体识别、姿态识别、10余种常见的运动计时、计数识别及…...

LED和QLED的区别

文章目录 1. 基础背光技术2. 量子点技术的引入3. 色彩表现4. 亮度和对比度5. 能效6. 寿命7. 价格总结 LED和 QLED都是基于液晶显示&#xff08;LCD&#xff09;技术的电视类型&#xff0c;但它们在显示技术、色彩表现和亮度方面有一些关键区别。以下是两者的详细区别&#xff…...

2024 年Postman 如何安装汉化中文版?

2024 年 Postman 的汉化中文版安装教程...

转化古老的Eclipse项目为使用gradle构建

很多古老的Java项目&#xff0c;是使用Eclipse作为IDE开发的。 那么&#xff0c;使用其它IDE的开发者&#xff0c;如何快速地进入这种古老项目的开发呢&#xff1f;或者说&#xff0c;一个Eclipse构建的古老项目&#xff0c;能不能转化成一个IDE无关的项目&#xff0c;进而所有…...

openGauss常见问题与故障处理(二)

2.网络故障定位手段 2.1 网络故障定位手段--常见网络故障引发的异常 在数据库正常工作的情况下&#xff0c;网络层对上层用户是透明的&#xff0c;但数据库在长期运行时&#xff0c;可能会由于各种原因导致出现网络异常或错误。 常见的因网络故障引发的异常有&#xff1a; 1>…...

Mysql 8迁移到达梦DM8遇到的报错

在实战迁移时&#xff0c;遇到两个报错。 一、列[tag]长度超出定义 在mysql中&#xff0c;tag字段的长度是varchar(20)&#xff0c;在迁移到DM8后&#xff0c;这个长度不够用了。怎么解决&#xff1f; 在迁移过程中&#xff0c;“指定对象”时&#xff0c;选择转换。 在“列映…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露&#xff0c;数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据&#xff0c;严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能&#xff0c;但SEMR…...