1. 问题背景与核心挑战
在量化交易和算法设计领域,单次交易最大利润问题(Best Time to Buy and Sell Stock)是一个经典的优化案例。我第一次接触这个问题是在准备某高频交易公司的面试时,当时被要求用O(n)时间复杂度解决。表面看这是个简单的数组遍历问题,但实际工程落地时会遇到不少隐藏陷阱。
这个问题的基础版本是:给定一个数组prices,其中prices[i]表示某支股票第i天的价格。你只能选择某天买入,并在之后的某天卖出,设计算法计算最大利润。例如输入[7,1,5,3,6,4],输出应该是5(第二天1买入,第五天6卖出)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 暴力解法与初步优化
2.1 双重循环的暴力解法
最直观的解法是用双重循环遍历所有可能的买卖组合:
python复制def maxProfit(prices):
max_profit = 0
for i in range(len(prices)):
for j in range(i+1, len(prices)):
profit = prices[j] - prices[i]
if profit > max_profit:
max_profit = profit
return max_profit
这个解法时间复杂度O(n²),在LeetCode上提交会直接超时。但它的价值在于帮我们理清问题本质——我们需要找到数组中后项减前项的最大差值。
2.2 单次遍历的动态规划优化
通过观察可以发现,我们只需要记录历史最低价,并在遍历时计算当前价格与历史最低价的差值:
python复制def maxProfit(prices):
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)
return max_profit
这个优化版将时间复杂度降到O
