LeetCode 题目 121:买卖股票的最佳时机

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣!

  • 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注
    在这里插入图片描述

  • 导航

    • LeetCode解锁1000题: 打怪升级之旅:每题都包括3-5种算法,以及详细的代码实现,刷题面试跳槽必备
    • 漫画版算法详解:通过漫画的形式和动态GIF图片把复杂的算法每一步进行详细可视解读,看一遍就掌握
    • python源码解读:解读python的源代码与调用关系,快速提升代码质量
    • python数据分析可视化:企业实战案例:企业级数据分析案例与可视化,提升数据分析思维和可视化能力
    • 程序员必备的数学知识与应用:全面详细的介绍了工程师都必备的数学知识

期待与您一起探索技术、持续学习、一步步打怪升级 欢迎订阅本专栏❤️❤️

题目描述

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

在这里插入图片描述

方法一:一次遍历

解题步骤:
  1. 初始化两个变量:min_price 为正无穷大,用于记录遍历过程中遇到的最低价格;max_profit 为0,用于记录最大利润。
  2. 遍历价格数组,对于每个价格,更新 min_price,并计算以当前价格卖出的利润,更新 max_profit
Python 代码示例
def maxProfit(prices):
    min_price = float('inf')
    max_profit = 0
    for price in prices:
        if price < min_price:
            min_price = price
        elif price - min_price > max_profit:
            max_profit = price - min_price
    return max_profit

方法一通过一次遍历来解决买卖股票的最佳时机问题,下面用 ASCII 图形来详细解释这个方法的工作原理。

一次遍历的图解

考虑一个具体的价格数组示例:

prices = [7, 1, 5, 3, 6, 4]

我们需要找到买入和卖出的最佳时机,以获取最大利润。下面的图解将展示如何在一次遍历中实现这一点。

初始状态
  1. 初始化 min_price 为正无穷大。
  2. 初始化 max_profit 为0。
遍历过程
初始: min_price = inf, max_profit = 0

第1天: price = 7
  min_price = min(inf, 7) = 7
  max_profit = max(0, 7 - 7) = 0
  状态: min_price = 7, max_profit = 0

第2天: price = 1
  min_price = min(7, 1) = 1
  max_profit = max(0, 1 - 1) = 0
  状态: min_price = 1, max_profit = 0

第3天: price = 5
  min_price = min(1, 5) = 1
  max_profit = max(0, 5 - 1) = 4
  状态: min_price = 1, max_profit = 4

第4天: price = 3
  min_price = min(1, 3) = 1
  max_profit = max(4, 3 - 1) = 4
  状态: min_price = 1, max_profit = 4

第5天: price = 6
  min_price = min(1, 6) = 1
  max_profit = max(4, 6 - 1) = 5
  状态: min_price = 1, max_profit = 5

第6天: price = 4
  min_price = min(1, 4) = 1
  max_profit = max(5, 4 - 1) = 5
  状态: min_price = 1, max_profit = 5
结果
  • 最终得到的最大利润是 5,即在价格为 1 的第2天买入,在价格为 6 的第5天卖出。
总结步骤
  • 初始化两个变量 min_pricemax_profit
  • 遍历价格数组,更新 min_price 为遇到的最小价格。
  • 对每个价格,计算如果当天卖出的利润,并更新 max_profit
  • 最后的 max_profit 就是最大利润。

这种方法简单而有效,只需一次遍历就能找到最大利润,同时也避免了复杂的计算和额外的空间开销。

方法二:动态规划

解题步骤:
  1. 使用一个数组 dp 来记录每天结束时可能得到的最大利润。
  2. 第一天的利润为0;从第二天开始,更新当前最小购买价格,并计算当前可能的最大利润。
Python 代码示例
def maxProfit(prices):
    if not prices:
        return 0
    n = len(prices)
    min_price = prices[0]
    max_profit = 0
    for i in range(1, n):
        min_price = min(min_price, prices[i])
        max_profit = max(max_profit, prices[i] - min_price)
    return max_profit

方法三:分治法

解题步骤:
  1. 将价格数组分为两部分,递归地找出左右两部分的最大利润。
  2. 计算跨越两部分的最大利润,即左侧的最低价格和右侧的最高价格之差。
  3. 最大利润是左侧、右侧和跨中三者的最大值。
Python 代码示例
def maxProfit(prices):
    def maxCrossingProfit(left, right):
        if left == right:
            return 0
        mid = (left + right) // 2
        min_left = min(prices[left:mid+1])
        max_right = max(prices[mid+1:right+1])
        return max(0, max_right - min_left)
    
    def divideAndConquer(left, right):
        if left >= right:
            return 0
        mid = (left + right) // 2
        left_profit = divideAndConquer(left, mid)
        right_profit = divideAndConquer(mid + 1, right)
        cross_profit = maxCrossingProfit(left, right)
        return max(left_profit, right_profit, cross_profit)
    
    return divideAndConquer(0, len(prices) - 1)

方法四:前缀最小值与后缀最大值

解题步骤:
  1. 创建两个数组,分别存储从左到右的前缀最小值和从右到左的后缀最大值。
  2. 遍历 prices 数组,计算利用前缀最小和后缀最大计算可能的最大利润。
Python 代码示例
def maxProfit(prices):
    n = len(prices)
    if n == 0:
        return 0
    min_prefix = [0] * n
    max_suffix = [0] * n
    min_prefix[0] = prices[0]
    for i in range(1, n):
        min_prefix[i] = min(min_prefix[i-1], prices[i])
    max_suffix[n-1] = prices[n-1]
    for i in range(n-2, -1, -1):
        max_suffix[i] = max(max_suffix[i+1], prices[i])
    max_profit = 0
    for i in range(n):
        max_profit = max(max_profit, max_suffix[i] - min_prefix[i])
    return max_profit

方法五:Kadane算法变形

解题步骤:
  1. 理解为找最大子数组和的问题,其中“价格差”数组是原数组相邻元素的差值。
  2. 使用Kadane算法找到最大子数组和,即为最大利润。
Python 代码示例
def maxProfit(prices):
    max_current = max_global = 0
    for i in range(1, len(prices)):
        max_current = max(0, max_current + prices[i] - prices[i-1])
        if max_current > max_global:
            max_global = max_current
    return max_global

算法分析

  • 时间复杂度:所有方法均为 (O(n)),其中 (n) 是数组长度,因为每个方法都只遍历了一次或两次数组。
  • 空间复杂度
    • 方法一和五:(O(1)),只使用了常数空间。
    • 方法二、三和四:(O(n)),因为使用了额外的数组。

不同算法的优劣势对比

  • 一次遍历(方法一)和Kadane算法变形(方法五)非常高效,简单,易于实现。
  • 动态规划(方法二)直观,易于理解,常用于面试中解释。
  • 分治法(方法三)和前缀最小值与后缀最大值(方法四)提供了不同的视角,适合深入理解问题的结构,但实现较为复杂。

应用示例

这些方法可以应用于金融分析领域,特别是在算法交易和股票市场分析中,用于计算和预测最优买卖点,从而最大化投资回报。

🌹🌹如果觉得这篇文对你有帮助的话,记得一键三连关注、赞👍🏻、收藏是对作者最大的鼓励,非常感谢 ❥(^_-)

❤️❤️作者知识有限,如有错误,请各位大佬评论区批评指正,不胜感激❥(^_-)
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

重发布和路由策略实验(课堂练习)

需求&#xff1a; 将1.1.1.0/24网段&#xff08;不在OSPF中&#xff09;重发布到网络中&#xff0c;不允许出现次优路径&#xff0c;实现全网可达。 需求分析&#xff1a; 1、在R1上重发布1.1.1.0/24网段&#xff0c;但是需要过滤192.168.12.0/24和192.168.13.0/24 2、在R2和R3…

截图识别OCR怎么操作?一键精准识别工具分享

截图识别OCR怎么操作&#xff1f;截图识别OCR软件在现代办公和学习中扮演着越来越重要的角色&#xff0c;它们能够将图片中的文字内容快速准确地转换为可编辑的文本。无论是处理文档、整理笔记&#xff0c;还是进行学术研究、资料收集&#xff0c;这些软件都能快速、准确地将图…

2024年怎样提取小程序里的视频

在未来的2024年&#xff0c;我们亲眼目睹了科技的飞速发展和互联网的无限可能。在这个数字化世界中&#xff0c;小程序已经成为我们日常生活中不可或缺的一部分&#xff0c;无论是购物、学习&#xff0c;还是娱乐&#xff0c;小程序都给我们带来了前所未有的便利。然而&#xf…

太速科技-FMC377_双AD9361 射频收发模块

FMC377_双AD9361 射频收发模块 FEATURES&#xff1a; ◆ Coverage from 70M ~ 6GHz RF ◆ Flexible rate 12 bit ADC/DAC ◆ Fully-coherent 4x4 MIMO capability, TDD/FDD ◆ RF ports: 50Ω Matched ◆ support both internal reference and exter…

腾讯提出InstantMesh:超快速的图像转 3D且质量很高,30秒内免费从一张图片生成3D模型

腾讯提出的InstantMes&#xff0c;能够从单张图像快速生成高质量的三维网格模型。这项技术利用了前馈框架&#xff0c;结合了多视图扩散模型和基于大规模重建模型&#xff08;LRM&#xff09;的稀疏视图重建技术&#xff0c;极大地优化了3D资产的创建过程。 如上图所示&#xf…

第四届上海理工大学程序设计全国挑战赛 J.上学 题解 DFS 容斥

上学 题目描述 usst 小学里有 n 名学生&#xff0c;他们分别居住在 n 个地点&#xff0c;第 i 名学生居住在第 i 个地点&#xff0c;这些地点由 n−1 条双向道路连接&#xff0c;保证任意两个地点之间可以通过若干条双向道路抵达。学校则位于另外的第 0 个地点&#xff0c;第…

插件:Best HTTP

一、简介 WebSocket WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直接可以创建持久性的连接&#xff0c;并进行双向数据传输。…

【保姆级教程】VMware Workstation Pro的虚拟机导入vritualbox详细教程

解决方案 1、OVF格式2、VMX格式 1、OVF格式 选定需要导出的虚拟机&#xff08;关闭或者挂起状态下&#xff09;依次选择文件-导出为ovf 在Vritualbox导入刚刚导出的.ovf文件 更改路径&#xff0c;按实际需要修改 成功导入 2、VMX格式 如果在VMware Workstation Pro导出的…

算法练习之双指针算法

目录 前言 一、移动零【做题链接】 二、复写零【做题链接】 三、快乐数【做题链接】 四、盛水最多的容器【做题链接】 五、查找总价值为目标值的两件商品【做题链接】 六、三数之和【做题链接】 七、四数之和 【做题链接】 八、有效三角形的个数【做题链接】 总结 前言…

MapReduce | 二次排序

1.需求 主播数据--按照观众人数降序排序&#xff0c;如果观众人数相同&#xff0c;按照直播时长降序 # 案例数据 用户id 观众人数 直播时长 团团 300 1000 小黑 200 2000 哦吼 400 7000 卢本伟 100 6000 八戒 250 5000 悟空 100 4000 唐僧 100 3000 # 期望结果 哦吼 4…

STC8增强型单片机开发【电位器案例(ADC)⭐⭐】

目录 一、引言 二、硬件准备 三、电路连接 四、软件编程 五、案例实现 六、总结 一、引言 STC8系列增强型单片机以其高性能、低功耗和丰富的外设接口&#xff0c;在嵌入式系统开发中得到了广泛应用。其中&#xff0c;模数转换器&#xff08;ADC&#xff09;是单片机的一…

鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式

运行机制 共享好端端的一词&#xff0c;近些年被玩坏了&#xff0c;共享单车,共享充电宝,共享办公室&#xff0c;共享雨伞… 甚至还有共享女朋友&#xff0c;真是人有多大胆&#xff0c;共享有多大产。但凡事太尽就容易恶心到人&#xff0c;自己也一度被 共享内存 恶心到了&am…

代码生成工具1 ——项目简介和基础开发

1 项目简介 需要提前在数据库建好表&#xff0c;然后执行代码生成工具&#xff0c;会生成简单的Java文件&#xff0c;避免重复编写增删改查代码。类似的工具网上有很多&#xff0c;本人开发这个工具属于自娱自乐。这个专栏会记录开发的过程。 2 项目搭建 数据库使用MySQL &…

MySQL中的子查询

子查询,在一个查询语句中又出现了查询语句 子查询可以出现在from和where后面 from 表子查询(结果一般为多行多列)把查询结果继续当一张表对待 where 标量子查询(结果集只有一行一列)查询身高最高的学生,查询到一个最高身高 列子查询(结果集只有一行多列) 对上表进行如下操作 …

韩顺平0基础学Java——第10天

p202-233 类与对象&#xff08;第七章&#xff09; 成员方法 person类中的speak方法&#xff1a; 1.public表示方法是公开的 2.void表示方法没有返回值 3.speak&#xff08;&#xff09;中&#xff0c;speak表示方法名&#xff0c;括号是形参列表。 4.大括号为方法体&am…

SpringCloud2024最新版链路追踪教程micrometer+zipkin

本文基于B站尚硅谷2024版springcloud教学视频&#xff0c;主要用于自己学习记录以及分享技术&#xff0c;侵权私删 自己本机环境信息&#xff1a; jdk&#xff1a;17.0.10springboot&#xff1a;3.2.0springcloud&#xff1a;2023.0.0 micrometer 之前行业内使用的分布式链路…

机器学习案例:加州房产价格(一)

参考链接&#xff1a;https://hands1ml.apachecn.org/2/ 假设你是被一家地产公司雇佣的数据科学家&#xff0c;现在需要做一些工作。 公司所给的数据集是StatLib 的加州房产价格数据集。这个数据集是基于 1990 年加州普查的数据。数据已经有点老&#xff0c;但它有许多优点&…

HCIP的学习(15)

第六章&#xff0c;BGP—边界网关协议 自治系统—AS ​ 定义&#xff1a;由一个单一的机构或组织所管理的一系列IP网络及其设备所构成的集合。 ​ AS的来源&#xff1a; 整个网络规模过大&#xff0c;会导致路由信息收敛速度过慢&#xff0c;设备对相同目标认知不同。AS之间…

HCIP 6(BGP综合实验)

一、实验拓扑 二、实验要求 1.AS1中存在两个环回&#xff0c;一个地址为192.168.1.0/24&#xff0c;该地址不能在任何协议中宣告&#xff1b;AS3中存在两个环回&#xff0c;一个地址为192.168.2.0/24&#xff0c;该地址不能在任何协议中宣告&#xff0c;最终要求这两个环回可以…

批量文本高效编辑神器:轻松拆分每行内容,一键保存更高效!轻松实现批量拆分与保存

文本处理成为我们日常工作中的一项重要任务。然而&#xff0c;面对大量的文本内容&#xff0c;传统的逐行编辑方式往往显得繁琐且效率低下。那么&#xff0c;有没有一种更高效、更便捷的解决方案呢&#xff1f;答案是肯定的——批量文本高效编辑神器&#xff0c;让您的文本处理…