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)

易错点

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

总结

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

相关推荐
满怀冰雪1 小时前
21-图像分类实战:从 MNIST 到 CIFAR-10
人工智能·python·深度学习·分类·数据挖掘·paddlepaddle
stolentime1 小时前
AT_agc066_a [AGC066A] Adjacent Difference题解
c++·算法·贪心算法·构造
Logintern091 小时前
Celery 的底层架构正是进程池、事件循环、epoll 和协程全部组合在了一起
python·架构·消息队列·进程·celery·事件循环
盖伦发发1 小时前
RAG 能跑≠能用:用 EDD 把 Eval 做成基础设施 (附源码)
人工智能·后端·python·功能测试
渣波1 小时前
深度解析:LeetCode 51. N 皇后 —— 回溯算法的巅峰之作
算法
咪饭只吃一小碗1 小时前
# C++ STL 常用容器方法全面总结vector / map / set / unordered_map / unordered_set
算法
daad7771 小时前
802.11 前导码与 STF 深度解析(含检测算法与 5G 对比
人工智能·算法·5g·wifi·802.11·前导码
郝学胜_神的一滴1 小时前
Python 高级编程 028:字典dict从入门到精通
python·ai编程
weixin_BYSJ19872 小时前
springboot小区物业管理小程序---附源码45555
java·javascript·spring boot·python·django·flask·php