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

LeetCode题练习与总结:买卖股票的最佳时机--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 <= prices.length <= 10^5
  • 0 <= prices[i] <= 10^4

二、解题思路

为了找到最大利润,我们需要找到买入和卖出股票的最佳时机。这个问题可以通过一次遍历数组来解决。我们可以在遍历过程中记录到目前为止遇到的最小价格,并且对于每一天,计算如果在这一天卖出股票能获得的最大利润。这样,我们就不需要考虑买入和卖出的具体时间点,只需要在遍历过程中不断更新最大利润即可。

具体步骤如下:

1. 初始化两个变量,minPrice设为第一天股票的价格,maxProfit设为0。

2. 遍历数组prices,对于每一天:

  • 计算如果在这一天卖出股票能获得的利润,即prices[i] - minPrice
  • 如果这个利润大于maxProfit,则更新maxProfit
  • 如果当前的股票价格prices[i]小于minPrice,则更新minPriceprices[i]

3. 遍历完成后,maxProfit就是能够获得的最大利润。

三、具体代码

class Solution {public int maxProfit(int[] prices) {int minPrice = Integer.MAX_VALUE;int maxProfit = 0;for (int price : prices) {if (price < minPrice) {minPrice = price;} else if (price - minPrice > maxProfit) {maxProfit = price - minPrice;}}return maxProfit;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 代码中有一个循环,该循环遍历一次给定数组prices
  • 在循环内部,每次迭代只进行常数时间的操作,包括比较和赋值。
  • 因此,循环的时间复杂度是O(n),其中n是数组prices的长度。
2. 空间复杂度
  • 代码中使用了一个固定大小的变量minPrice来存储最小价格,以及一个固定大小的变量maxProfit来存储最大利润。
  • 这些变量使用的空间不随输入数组的大小而变化。
  • 因此,空间复杂度是O(1),即常数空间复杂度。

综上所述,代码的时间复杂度是O(n),空间复杂度是O(1)。

五、总结知识点

  1. 数组的遍历:使用增强型for循环来遍历数组prices中的每个元素。

  2. 变量的初始化minPrice被初始化为Integer.MAX_VALUE,以便在遍历过程中找到最小的价格;maxProfit被初始化为0,用于存储最大利润。

  3. 条件语句:使用if-else语句来检查当前价格是否小于最小价格,或者卖出股票的利润是否大于当前的最大利润。

  4. 最大值和最小值的更新:在遍历过程中,如果找到更小的价格,则更新minPrice;如果找到更大的利润,则更新maxProfit

  5. 算术运算:计算当前价格和最小价格之间的差值,以确定卖出股票的利润。

  6. 整数类型的比较:在代码中进行了多次整数类型的比较,以决定是否更新minPricemaxProfit

  7. 整数类型的最大值:使用Integer.MAX_VALUE作为minPrice的初始值,以确保任何价格都不会大于它。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

相关文章:

  • 4. 流程控制语句
  • 【软考的系统分析师的考题考点解析2025】
  • 【面试干货】MySQL 三种锁的级别(表级锁、行级锁和页面锁)
  • 力扣每日一题 6/8
  • expect自动化交互应用程序工具
  • 【文件导出2】导出html文件数据
  • C# 绘图及古诗填字
  • Android基础-进程间通信
  • 熟悉的软件架构风格及详细介绍
  • 自动驾驶人工智能
  • 【深度学习】之 卷积(Convolution2D)、最大池化(Max Pooling)和 Dropout 的NumPy实现
  • arm系统中双网卡共存问题
  • 区块链共识机制技术一--POW(工作量证明)共识机制
  • Transformer论文精读
  • App UI 风格,引领时尚
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 【知识碎片】第三方登录弹窗效果
  • Android开源项目规范总结
  • JavaScript类型识别
  • JAVA之继承和多态
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • orm2 中文文档 3.1 模型属性
  • Protobuf3语言指南
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • use Google search engine
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 技术:超级实用的电脑小技巧
  • 老板让我十分钟上手nx-admin
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • #define
  • #define用法
  • #大学#套接字
  • (13)Hive调优——动态分区导致的小文件问题
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十五)使用Nexus创建Maven私服
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (算法)N皇后问题
  • (五)关系数据库标准语言SQL
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .net网站发布-允许更新此预编译站点
  • /etc/fstab 只读无法修改的解决办法
  • /var/log/cvslog 太大
  • [ai笔记9] openAI Sora技术文档引用文献汇总