1. 问题背景与核心挑战
股票交易时机选择是量化金融和算法交易中的经典问题。LeetCode上的"买卖股票的最佳时机"系列题目,本质上考察的是如何在价格波动序列中寻找最优买卖点以获取最大利润。这类问题不仅出现在编程面试中,更是对冲基金和量化交易公司的实际业务场景。
我处理过多个交易所的实时行情数据系统,发现这类问题的变种在实际交易系统中无处不在。比如高频交易中的微秒级套利、量化策略中的均值回归模型,核心逻辑都与这个基础问题相通。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础问题解析(单次交易)
2.1 问题描述
给定一个数组 prices,其中 prices[i] 表示股票第 i 天的价格。你只能选择某一天买入,并在未来某个不同的日子卖出。设计算法计算最大利润。
示例:
输入:[7,1,5,3,6,4]
输出:5(第2天买入,第5天卖出)
2.2 暴力解法与优化
新手最容易想到的是双重循环:
python复制max_profit = 0
for i in range(len(prices)):
for j in range(i+1, len(prices)):
profit = prices[j] - prices[i]
max_profit = max(max_profit, profit)
时间复杂度O(n²),在LeetCode上会超时。
优化思路:维护一个历史最低价min_price,计算当前价格与min_price的差值:
python复制min_price = float('inf')
max_profit = 0
for price in prices:
min_price = min(min_price, price)
max_profit = max(max_profit, price - min_price)
时间复杂度降至O(n),空间复杂度O(1)。
关键点:这个解法体现了动态规划的思想,将问题分解为"在第i天卖出时的最大利润"子问题。
3. 进阶问题解析(多次交易)
3.1 问题变种
LeetCode 122题允许无限次交易(但必须卖完才能再买),求最大利润。
示例:
输入:[7,1,5,3,6,4]
输出:7(第2天买入第3天
