#121
Easy
动态规划

Best Time to Buy and Sell Stock

一次买卖股票可获得的最大利润。

ArrayDP

题目定位

最清晰的思路是持续维护到当前位置为止最好的买入点,然后看今天卖出是否刷新答案。

关键观察

对于今天来说,历史上真正有用的信息只有“到昨天为止的最低价格”。

目标复杂度

O(n) / O(1)

这题的解法思路怎么拆

1

最清晰的思路是持续维护到当前位置为止最好的买入点,然后看今天卖出是否刷新答案。

2

对于今天来说,历史上真正有用的信息只有“到昨天为止的最低价格”。

3

先用自然语言命名状态。

4

列出哪些决策会转移到这个状态。

参考实现

Python
# Generic pattern template
# 1D DP
dp = [0] * (n + 1)
dp[0] = base
for i in range(1, n + 1):
    dp[i] = transition(dp, i)

# 2D DP
dp = [[0] * (m + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
    for j in range(1, m + 1):
        dp[i][j] = transition(dp, i, j)

常见坑点

warning

最低价更新顺序写错,等于允许先卖后买。

warning

把题目误解成可以多次交易。

高频追问

如果允许多次交易,模型怎么变?

你能把它解释成滚动 DP 状态吗?

继续刷相关题

先把 动态规划 这个模式刷成体系,再去做更难变体。

view_week回到模式页
LeetCode 121. Best Time to Buy and Sell Stock 题解思路 | Interview AiBox