LC122
买卖股票 II · 上坡金币收集器
不是找最低点,也不是预测最高点;只要今天到明天是上坡,就把这段利润拿走。
贪心多次交易相邻差价时间 O(n) · 空间 O(1)
输入 · prices
715364
多次交易意味着每一段上涨都可以单独吃掉,答案就是所有正向相邻差价之和。
最大利润
+7
(5−1) + (6−3) = 4 + 3 = 7
LC121 vs LC122 · 关键区别
LC121 — 只能交易一次
- 思路:维护 minPrice
- 公式: profit = max(prices[i] − minPrice)
- 买入必须早于卖出,找一对最佳点。
LC122 — 可以交易多次
- 思路:只看 相邻两天是否上涨
- 公式: profit = Σ max(0, prices[i] − prices[i−1])
- 每一段上涨都吃掉,不用预测峰谷。
⚠️ 如果谁还在把 LC122 讲成 prices[i] − minPrice,那是 LC121 的公式 — 在 LC122 里会导致漏掉每一段上涨。
题目规则Step 1 / 11
规则不是「找最低价」,而是「允许多次结算」
股价山路 · 上坡收金币,下坡跳过
尚未开始扫描金色坡道 · 上涨段 · 收集差价灰色虚线 · 下跌段 · 跳过不交易蓝色方块 · 机器人 · 沿山路移动
当前步骤
规则不是「找最低价」,而是「允许多次结算」
给定 prices = [7, 1, 5, 3, 6, 4]。你可以多次买卖,但同一时间最多持有一股。目标是最大利润。
profit 计分板
上坡 = 加分+0/ 终局 +7
profit (before)
+0
profit (after)
+0
Go 解法 · 与动画联动
▶ line 1i
—
prices[i-1]
—
prices[i]
—
profit
+0
▶1func maxProfit(prices []int) int {▶2 profit := 0▶3 for i := 1; i < len(prices); i++ {▶4 if prices[i] > prices[i-1] {▶5 profit += prices[i] - prices[i-1]▶6 }▶7 }▶8 return profit▶9}
函数入口,i 还没开始,profit 也未初始化。
步骤导航
执行表 · 每个 i 处理一条相邻差价
点击行跳到对应步骤| i | prices[i-1] | prices[i] | diff | action | profit |
|---|---|---|---|---|---|
| 1 | 7 | 1 | -6 | 跳过 | 0 |
| 2 | 1 | 5 | +4 | profit += 4 | 4 |
| 3 | 5 | 3 | -2 | 跳过 | 4 |
| 4 | 3 | 6 | +3 | profit += 3 | 7 |
| 5 | 6 | 4 | -2 | 跳过 | 7 |
面试 30 秒答题模板
这道题允许多次买卖、同一时间最多持有一股,所以可以贪心:从第 1 天开始,只要 prices[i] > prices[i-1],就把这段差价加到 profit;其它情况都跳过。正确性来自两条观察:① 连续上涨段「拆开卖」和「最后一天卖」利润完全相同;② 多次交易允许避开下跌段,所以只收正差价严格不劣于一直持有。时间 O(n),空间 O(1)。
常见误区 · 别再翻车
- 把 LC122 当 LC121还在维护 minPrice、用 prices[i] − minPrice — 那是 LC121 一次交易的思路,会漏掉每一段上涨。LC122 只看相邻两天差价。
- 纠结真实买卖日期你不需要记录到底哪天买、哪天卖;累计「正向相邻差价」就等价于一组合法的多次交易方案。
- 以为连续上涨只能最后一天卖1→2→3→4 不管是「最后卖一次」还是「每天卖再买」利润都是 3。拆开计算反而最省心。
- 忘记题目假设本题没有手续费、冷冻期、交易次数限制。一旦带上这些约束,就要换成 DP(见 LC714 / LC309 / LC123),贪心不再成立。