news 2026/6/15 0:18:09

【力扣100题】94.买卖股票的最佳时机

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【力扣100题】94.买卖股票的最佳时机

题目描述

给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。返回你能获取的最大利润。如果不能获取任何利润,返回 0。

示例 1:

输入:[7,1,5,3,6,4] 输出:5 解释:在第 2 天买入(价格=1),在第 5 天卖出(价格=6),最大利润 = 6-1 = 5

示例 2:

输入:[7,6,4,3,1] 输出:0 解释:没有交易完成,最大利润为 0

解题思路总览

思路时间复杂度空间复杂度适用场景
暴力枚举O(n^2)O(1)能想到但会超时
前缀最小值O(n)O(1)本题最优解
动态规划O(n)O(n)通用解法

算法一:暴力枚举

思路

枚举所有可能的买入和卖出日期组合,找到最大利润。

代码

classSolution{public:intmaxProfit(vector<int>&prices){intans=0;intn=prices.size();for(inti=0;i<n;i++){for(intj=i+1;j<n;j++){ans=max(ans,prices[j]-prices[i]);}}returnans;}};

算法流程

输入: prices = [7, 1, 5, 3, 6, 4] 第一层循环(买入日 i): +-------------------------------------------------------------+ | i=0 (买入价=7): | | j=1: profit=1-7=-6 --> ans=0 | | j=2: profit=5-7=-2 --> ans=0 | | ...全部负数 | +-------------------------------------------------------------+ | i=1 (买入价=1): | | j=2: profit=5-1=4 --> ans=4 | | j=3: profit=3-1=2 --> ans=4 | | j=4: profit=6-1=5 --> ans=5 ★最大 | | j=5: profit=4-1=3 --> ans=5 | +-------------------------------------------------------------+ | i=2 (买入价=5): ...全部负数 | +-------------------------------------------------------------+ 输出: ans = 5

复杂度分析

复杂度分析
时间复杂度O(n^2)
- 两层循环枚举所有买卖组合
空间复杂度O(1)

算法二:前缀最小值(最优解)

思路

遍历一次,维护到当前位置为止的最低价格,同时计算在最低价买入、今天卖出的利润。

核心思想:在每个位置 i,我们想知道「之前最低多少钱买的」,然后计算「今天卖能赚多少」。

代码

classSolution{public:intmaxProfit(vector<int>&prices){intans=0;intmin_price=prices[0];for(intprice:prices){ans=max(ans,price-min_price);min_price=min(price,min_price);}returnans;}};

算法流程

输入: prices = [7, 1, 5, 3, 6, 4] 初始: min_price = 7, ans = 0 第一趟 (price=7): +-------------------------------------------------------------+ | price=7, min_price=7 | | ans = max(0, 7-7) = 0 --> ans=0 | | min_price = min(7,7) = 7 | +-------------------------------------------------------------+ 第二趟 (price=1): +-------------------------------------------------------------+ | price=1, min_price=7 | | ans = max(0, 1-7) = 0 --> ans=0 | | min_price = min(7,1) = 1 <-- 更新最低价 | +-------------------------------------------------------------+ 第三趟 (price=5): +-------------------------------------------------------------+ | price=5, min_price=1 | | ans = max(0, 5-1) = 4 --> ans=4 | | min_price = min(1,5) = 1 | +-------------------------------------------------------------+ 第四趟 (price=3): +-------------------------------------------------------------+ | price=3, min_price=1 | | ans = max(4, 3-1) = 4 --> ans=4 | | min_price = min(1,3) = 1 | +-------------------------------------------------------------+ 第五趟 (price=6): +-------------------------------------------------------------+ | price=6, min_price=1 | | ans = max(4, 6-1) = 5 --> ans=5 ★最大 | | min_price = min(1,6) = 1 | +-------------------------------------------------------------+ 第六趟 (price=4): +-------------------------------------------------------------+ | price=4, min_price=1 | | ans = max(5, 4-1) = 5 --> ans=5 | | min_price = min(1,4) = 1 | +-------------------------------------------------------------+ 输出: ans = 5

复杂度分析

复杂度分析
时间复杂度O(n)
- 只需一次遍历
空间复杂度O(1)
- 只用两个变量

算法三:动态规划

思路

定义dp[i]为以第 i 天结尾的最小买入价(实际上就是前缀最小值),也可以用dp[i]表示到第 i 天为止的最大利润。

代码

classSolution{public:intmaxProfit(vector<int>&prices){intn=prices.size();if(n==0)return0;// dp[i] = 前 i 天的最低价格vector<int>dp(n);dp[0]=prices[0];intans=0;for(inti=1;i<n;i++){dp[i]=min(dp[i-1],prices[i]);ans=max(ans,prices[i]-dp[i]);}returnans;}};

算法流程

输入: prices = [7, 1, 5, 3, 6, 4] 初始化: dp[0] = 7, ans = 0 i=1: dp[1] = min(7, 1) = 1 ans = max(0, 1-1) = 0 i=2: dp[2] = min(1, 5) = 1 ans = max(0, 5-1) = 4 i=3: dp[3] = min(1, 3) = 1 ans = max(4, 3-1) = 4 i=4: dp[4] = min(1, 6) = 1 ans = max(4, 6-1) = 5 i=5: dp[5] = min(1, 4) = 1 ans = max(5, 4-1) = 5 输出: ans = 5

复杂度分析

复杂度分析
时间复杂度O(n)
空间复杂度O(n)
- dp 数组存储每个位置的前缀最小值

复杂度对比总结

思路平均时间最坏时间空间评价
暴力枚举O(n^2)O(n^2)O(1)会超时
前缀最小值O(n)O(n)O(1)最优
动态规划O(n)O(n)O(n)可行但浪费空间

前缀最小值核心思想

prices = [7, 1, 5, 3, 6, 4] 遍历过程: +-------------------------------------------------------------+ | 天数 | 价格 | 到此天的最低价 | 最大利润 | | | day0 | 7 | 7 | 0 | | | day1 | 1 | 1 ↓ | 0 | 更新最低 | | day2 | 5 | 1 | 4 ↑ | 赚4块 | | day3 | 3 | 1 | 4 | | | day4 | 6 | 1 | 5 ↑ | 赚5块 | | day5 | 4 | 1 | 5 | | +-------------------------------------------------------------+ 关键洞察:在第 i 天卖出的最大利润 = prices[i] - min(prices[0..i])

面试追问 FAQ

问题回答
为什么只遍历一次?因为买入必须在卖之前,我们只需要记录「之前最低价」和「当前最大利润」
如果 prices 为空怎么办?题目保证 length >= 1,不需要特判
为什么不用动态规划数组?前缀最小值只需要一个变量存历史最低,用数组浪费空间
如果想求具体哪两天买卖呢?记录最低价出现的位置,遍历时同步更新即可

相关题目

题目难度核心点
122. 买卖股票的最佳时机 II中等允许多笔交易
123. 买卖股票的最佳时机 III困难最多两笔交易
188. 买卖股票的最佳时机 IV困难最多 k 笔交易
121. 买卖股票的最佳时机简单单笔交易,本题

总结

项目内容
核心思想前缀最小值:边遍历边记录历史最低价
关键公式ans = max(ans, price - min_price)
最优时间O(n)
最优空间O(1)
面试加分能解释「在最低价买入、当前价卖出」的思想

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

计算机Java毕设实战-基于 SpringBoot 的社区垃圾站点运维管理系统的设计与实现 智慧环保视角下社区垃圾管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/15 0:10:54

深入解析MPC8280 SCC:参数RAM、中断与UART模式实战指南

1. 项目概述&#xff1a;深入MPC8280的串行通信心脏在嵌入式通信系统的开发中&#xff0c;处理串行数据流是家常便饭。无论是连接调试终端、与外部传感器对话&#xff0c;还是实现设备间的可靠数据链路&#xff0c;一个高效、灵活的串行通信控制器&#xff08;SCC&#xff09;都…

作者头像 李华
网站建设 2026/6/15 0:01:59

深蓝词库转换:打破20+输入法壁垒的技术架构深度解析

深蓝词库转换&#xff1a;打破20输入法壁垒的技术架构深度解析 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 当你在不同平台间切换输入法时&#xff0c;是否曾为无…

作者头像 李华
网站建设 2026/6/14 23:57:16

打造空间数字镜像 构建新时代营区全域透明智能管理新模式

打造空间数字镜像 构建新时代营区全域透明智能管理新模式镜像视界浙江科技有限公司依托国家十四五重点课题研究、镜像视界浙江普陀时空大数据应用技术联合研究院联合研究、河南省电检院权威机构认证技术体系&#xff0c;基于自研SpaceOS™空间操作系统底座搭载八大核心引擎&…

作者头像 李华
网站建设 2026/6/14 23:57:14

锚定空间透明化目标 依托核心孪生技术赋能现代化营区建设

镜像视界浙江科技有限公司依托国家十四五重点课题研究、镜像视界浙江普陀时空大数据应用技术联合研究院联合研究、河南省电检院权威机构认证自研技术体系&#xff0c;基于SpaceOS™空间操作系统底座全域驱动&#xff0c;锚定营区物理空间透明化管理建设目标&#xff0c;依托视频…

作者头像 李华
网站建设 2026/6/14 23:54:11

机器学习模型上线后为何频繁失效?生产级ML系统性风险解析

1. 为什么“模型上线”不是终点&#xff0c;而是系统性风险的起点&#xff1f;你有没有经历过这样的场景&#xff1a;凌晨两点&#xff0c;手机突然震动&#xff0c;钉钉消息一条接一条弹出来——“风控决策延迟超时”“用户申请失败率飙升至32%”“实时反欺诈服务响应时间突破…

作者头像 李华