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

【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。

提示:

  • 1 <= prices.length <=
  • 0 <= prices[i] <=

解题思路

核心逻辑是记录历史最低买入价,实时计算当日卖出的利润

  1. 初始化 “最低买入价” 为第一天价格,“最大利润” 为 0;
  2. 遍历后续每天的价格:
    • 若当日价格低于 “最低买入价”,更新 “最低买入价”;
    • 计算 “当日价格 - 最低买入价” 的利润,若大于当前 “最大利润”,则更新 “最大利润”;
  3. 遍历结束后,返回 “最大利润”(若利润为负则返回 0)。

示例验证

示例 1:输入prices = [7,1,5,3,6,4]
  • 遍历过程:
    • 价格 1:min_price=1,利润 0 → max_profit=0;
    • 价格 5:利润 5-1=4 → max_profit=4;
    • 价格 3:利润 3-1=2 → 不更新;
    • 价格 6:利润 6-1=5 → max_profit=5;
    • 价格 4:利润 4-1=3 → 不更新;
  • 最终返回:5(符合预期)。
示例 2:输入prices = [7,6,4,3,1]
  • 遍历过程中,每日利润均为负数,max_profit 始终保持 0;
  • 最终返回:0(符合预期)。

核心优势

  • 时间复杂度 O (n):仅一次线性遍历,无嵌套操作,适配 10⁵级别的数组长度;
  • 空间复杂度 O (1):仅使用 2 个变量存储中间结果,无额外空间开销;
  • 鲁棒性:处理了 “数组长度不足 2”“价格持续下跌” 等边界场景。

Python代码:

from typing import List class Solution: def maxProfit(self, prices: List[int]) -> int: if len(prices) < 2: return 0 min_price = prices[0] max_profit = 0 for price in prices[1:]: min_price = min(min_price, price) current_profit = price - min_price max_profit = max(max_profit, current_profit) return max_profit # 测试用例 if __name__ == "__main__": solution = Solution() # 示例1 print(f"示例1输入: [7,1,5,3,6,4]") print(f"示例1输出: {solution.maxProfit([7,1,5,3,6,4])}") # 示例2 print(f"示例2输入: [7,6,4,3,1]") print(f"示例2输出: {solution.maxProfit([7,6,4,3,1])}") # 边界用例:数组长度为1 print(f"示例3输入: [5]") print(f"示例3输出: {solution.maxProfit([5])}") # 边界用例:价格持续上涨 print(f"示例4输入: [1,2,3,4,5]") print(f"示例4输出: {solution.maxProfit([1,2,3,4,5])}")

LeetCode提交代码:

from typing import List class Solution: def maxProfit(self, prices: List[int]) -> int: # 边界条件:数组长度不足2时,无法完成交易,利润为0 if len(prices) < 2: return 0 min_price = prices[0] # 记录历史最低买入价 max_profit = 0 # 记录最大利润 # 遍历每天的价格,计算最大利润 for price in prices[1:]: # 更新历史最低买入价 min_price = min(min_price, price) # 计算当日卖出的利润,并更新最大利润 current_profit = price - min_price max_profit = max(max_profit, current_profit) return max_profit

程序运行结果如下:

示例1输入: [7,1,5,3,6,4] 示例1输出: 5 示例2输入: [7,6,4,3,1] 示例2输出: 0 示例3输入: [5] 示例3输出: 0 示例4输入: [1,2,3,4,5] 示例4输出: 4

总结

本文介绍了股票买卖问题的解决方案,要求在给定股票价格数组中找到最大利润。算法通过记录历史最低买入价并实时计算当前利润来实现,时间复杂度O(n),空间复杂度O(1)。关键步骤包括:初始化最低价为第一天价格,遍历后续价格更新最低价并计算利润,最终返回最大利润(若为负则返回0)。示例验证和边界条件处理证明了算法的正确性和鲁棒性,适用于不同价格趋势的输入。Python代码实现简洁高效,通过测试用例验证了算法的有效性。

http://www.jsqmd.com/news/79684/

相关文章:

  • 仿生海马网络:优化大模型长文本处理效率难题的新范式
  • 零延迟英雄锁定:League Akari智能选人系统深度解析
  • 乳糖-N-六糖—人乳寡糖的黄金标准,赋能新一代营养与治疗策略 CAS:64003-51-6
  • Windows右键菜单优化:从卡顿到流畅的完整指南
  • 同一线程有两个boost::asio::io_context可以吗?
  • WebRTC 是什么?能做什么?(概览篇)
  • 第七组 代码规范与冲刺任务
  • 深入解析Transformers 4.37:因果语言建模与掩码语言建模全流程实践指南
  • downkyi终极指南:轻松掌握B站高清视频下载技巧
  • 递归的作业练习
  • 【LeetCode刷题】缺失的第一个正数
  • 突破AI推理天花板:GenSelect与TIR技术如何重塑大模型决策能力
  • 国内大模型部署难题突破:轻量级模型Magistral-Small-2509实现低资源环境高效运行
  • Z-image LoRA 训练整合包下载与使用教程(详细图文教程)
  • OTOFIX D1 PRO One-Year Online Update Subscription for European/American Vehicles
  • Dubbo学习(二):深入 RPC
  • League Akari:8大实用功能快速提升你的英雄联盟游戏体验
  • Dubbo学习(三):深入 Remoting
  • 神经网络中有超参数和自学习参数吗?
  • Day23 回归问题与置信区间
  • AI设计新突破:QWEN溶图LoRA模型助力品牌视觉创作升级
  • 大模型教我成为大模型算法工程师之day8: 优化器与训练技巧
  • Java毕设项目:基于springboot成都旅游网四季成都、特色文化(源码+文档,讲解、调试运行,定制等)
  • League Akari:6个实用功能让你告别繁琐操作,轻松上分
  • api vs jsp 绑定风格
  • 理解 Proxy 原理及如何拦截 Map、Set 等集合方法调用实现自定义拦截和日志——含示例代码解析
  • Java毕设项目:基于springboot厨具厂产品在线销售系统设计与实现小程序(源码+文档,讲解、调试运行,定制等)
  • Java毕设项目:基于springboot二手商品网站(源码+文档,讲解、调试运行,定制等)
  • 详解 Gitee/GitHub 中 HTTPS/SSH 方式数据库仓库创建与本地连接
  • 第五十七篇-ComfyUI+V100-32G+安装SD1.5