LeetCode 121. 买卖股票的最佳时机|Python 解法详解
CSDN 算法专题 · 数组与哈希表 | 难度:简单
题目信息
- 题号:121
- 难度:简单
- LeetCode:题目链接
题目描述
给定每日股价,只允许先买入一次、后卖出一次,求最大利润;无法获利时返回 0。
示例
text
输入:prices = [7,1,5,3,6,4]
输出:5
约束
1 ≤ prices.length ≤ 10⁵。
解题思路
核心观察
从左向右维护此前最低买入价。当天作为卖出日时,最大候选利润是当前价减最低价;更新全局最大值。时间顺序天然保证先买后卖。
推导与执行步骤
- 初始化最低价为无穷大
- 遍历每日价格
- 更新此前最低价格
- 计算当天卖出的利润并更新答案
为什么这个方法正确
算法始终围绕上述核心观察维护有效状态,并且每一步只排除已经能够证明不可能产生更优答案的情况。按照执行步骤处理后,所有可能影响答案的元素或节点都会被恰好检查,因此不会遗漏合法答案;状态更新又严格遵守题目约束,所以最终结果有效。
从边界看,空区间、单个元素、全部相同或完全不匹配等情况都会落入初始化条件或循环终止条件,不需要依赖未定义状态。实现时再重点检查下标、空节点和重复元素,即可保证算法在极端输入下仍然成立。
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)
易错点
最低价只能来自当前日或更早,不能用未来价格。
总结
这道题的关键是:从左向右维护此前最低买入价。理解这一点后,再结合边界条件检查,代码就能保持清晰且稳定。