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)

易错点

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

总结

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

相关推荐
智能体与具身智能6 小时前
TVA具身智能的概念、架构与应用(19)
人工智能·python·具身智能
2601_962294616 小时前
python中range函数怎么用
python·for循环·可迭代对象·range函数·整数列表
青 春 记 忆7 小时前
零基础入门python70:Docker Compose 编排完整后端
python·后端开发
新时代牛马7 小时前
字符设备驱动完整篇:从 cdev_add、file_operations 到chrdev_open 与排障
开发语言·python
政企项目老覃8 小时前
大模型幻觉治理与自动评测:金融风控场景的落地实践
人工智能·算法·机器学习
淡海水8 小时前
08-03-不可变-ImmutableDictionary-TKey-TValue-与ImmutableHashSet-T-持久化哈希树
数据结构·算法·c#·哈希算法·dictionary·immutable
白山编程大哥8 小时前
Java OutputStreamWriter 详解:从字符到字节的桥梁
java·开发语言·python
hansang_IR8 小时前
【题解】[APIO2023] 赛博乐园 / cyberland
c++·算法·图论
洛阳纸贵9 小时前
MATLAB-matlab基础知识
学习·算法·matlab