LeetCode 121. 买卖股票的最佳时机|Python 解法详解

LeetCode 121. 买卖股票的最佳时机|Python 解法详解

CSDN 算法专题 · 数组与哈希表 | 难度:简单

题目信息

题目描述

给定每日股价,只允许先买入一次、后卖出一次,求最大利润;无法获利时返回 0。

示例

text 复制代码
输入:prices = [7,1,5,3,6,4]
输出:5

约束

1 ≤ prices.length ≤ 10⁵。

解题思路

核心观察

从左向右维护此前最低买入价。当天作为卖出日时,最大候选利润是当前价减最低价;更新全局最大值。时间顺序天然保证先买后卖。

推导与执行步骤

  1. 初始化最低价为无穷大
  2. 遍历每日价格
  3. 更新此前最低价格
  4. 计算当天卖出的利润并更新答案

为什么这个方法正确

算法始终围绕上述核心观察维护有效状态,并且每一步只排除已经能够证明不可能产生更优答案的情况。按照执行步骤处理后,所有可能影响答案的元素或节点都会被恰好检查,因此不会遗漏合法答案;状态更新又严格遵守题目约束,所以最终结果有效。

从边界看,空区间、单个元素、全部相同或完全不匹配等情况都会落入初始化条件或循环终止条件,不需要依赖未定义状态。实现时再重点检查下标、空节点和重复元素,即可保证算法在极端输入下仍然成立。

Python 代码

python 复制代码
# 解法核心:从左向右维护此前最低买入价。当天作为卖出日时,最大候选利润是当前价减最低价;更新全局最大值。时间顺序天然保证先买后卖。
# 实现步骤:
# 1. 初始化最低价为无穷大
# 2. 遍历每日价格
# 3. 更新此前最低价格
# 4. 计算当天卖出的利润并更新答案

from typing import List

class Solution:

    def maxProfit(self, prices: List[int]) -> int:
        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

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

易错点

最低价只能来自当前日或更早,不能用未来价格。

总结

这道题的关键是:从左向右维护此前最低买入价。理解这一点后,再结合边界条件检查,代码就能保持清晰且稳定。

相关推荐
xys_67814 分钟前
深挖数据结构:树和二叉树(上)
数据结构·算法
Merrill_hh24 分钟前
Python环境搭建
python
用户0190275816129 分钟前
如何用 Python 回测布林带突破策略?
python
Interview Aid11237 分钟前
Google SWE Intern VO 面经:两轮 Coding,Follow-up 考察 BFS 状态
算法
4SAPI39 分钟前
企业Agent落地选型:大模型API接入方案迁移实践与稳定性评估
人工智能·python·php
用户019027581611 小时前
如何用 Python 计算 CR 能量指标(中间意愿指标)?
python
曲径海盗1 小时前
【Python 学习第 34 天】条件判断 if/else
python·学习笔记·编程入门
用户6602676118791 小时前
重试不重复下单还不够:同一幂等键换了参数,应该返回什么?
python
五网1 小时前
用Python搭建创业项目财务测算模型:CAC、LTV、盈亏平衡点一键算出(附完整代码)
python
琳达爱分享1 小时前
从单机令牌桶到集群限流:一次配额超发的复盘
后端·算法