news 2026/4/23 13:22:24

【LeetCode刷题】买卖股票的最佳时机

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【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代码实现简洁高效,通过测试用例验证了算法的有效性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 14:10:44

Dubbo学习(二):深入 RPC

深入 RPC:一次远程调用的“奇幻漂流” —— 协议、Metadata 与序列化 请关注公众号【碳硅化合物AI】 摘要 本篇将深入 Dubbo 的核心地带 —— RPC 层。我们将揭开一次方法调用是如何被“打包”成网络请求,又是如何在另一端被“还原”并执行的。本文涵盖 Invoker 的前世今生…

作者头像 李华
网站建设 2026/4/19 19:45:50

IC卡门禁读卡器是一款高性能、多协议兼容的智能识别终端,专为门禁、梯控、闸机等场景设计。它同时支持125KHz低频协议和13.56MHz高频协议,具备极强的环境适应性,可在金属表面(建议开孔安装)

IC卡门禁读卡器/梯控读头规格书&#xff08;2026版&#xff09;。这份文档整合了技术参数&#xff0c;并参考了行业标准进行了结构化排版&#xff0c;方便您用于采购、技术对接或存档。&#x1f4c4; IC卡门禁读卡器/梯控读头规格书产品型号&#xff1a; 梯控读头 DAIC-TK-RW /…

作者头像 李华
网站建设 2026/4/18 3:44:13

基于SpringBoot + Vue的垃圾分类审核管理平台

文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言 &#x1f49b;博主介绍&#…

作者头像 李华
网站建设 2026/4/22 19:29:36

League Akari终极指南:快速掌握免费英雄联盟智能助手

League Akari终极指南&#xff1a;快速掌握免费英雄联盟智能助手 【免费下载链接】LeagueAkari ✨兴趣使然的&#xff0c;功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari 想要彻底改…

作者头像 李华
网站建设 2026/4/16 13:09:59

OpenAI开源安全推理引擎震撼发布:gpt-oss-safeguard改写AI内容治理规则

2025年10月29日&#xff0c;人工智能领域再次迎来里程碑事件——OpenAI正式对外开源其安全分类推理模型gpt-oss-safeguard。这款包含1200亿和200亿参数两个版本的重磅产品&#xff0c;不仅采用商业友好的Apache 2.0许可证&#xff0c;更以"策略即规则"的创新理念&…

作者头像 李华
网站建设 2026/4/21 10:11:48

匹配回文串:利用KMP算法求解

一、先明确问题&#xff1a;什么是 “回文串”&#xff1f;回文串定义&#xff1a;回文串是指正读和反读都完全相同的字符串比如 “abcba”“aaa”“level” 都是回文串&#xff0c;而 “abcd”“abbaa” 不是。可以简单理解为&#xff1a;字符串从左到右读&#xff0c;和从右到…

作者头像 李华