D

当前:LC122 · 买卖股票的最佳时机 II · 首次出现于 Day 40 · 路径:顶栏「56天打卡」→ 点击 LC 题号 → 逐题动画

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
规则不是「找最低价」,而是「允许多次结算」

股价山路 · 上坡收金币,下坡跳过

尚未开始扫描
7Day 01Day 15Day 23Day 36Day 44Day 5
金色坡道 · 上涨段 · 收集差价灰色虚线 · 下跌段 · 跳过不交易蓝色方块 · 机器人 · 沿山路移动
当前步骤
规则不是「找最低价」,而是「允许多次结算」

给定 prices = [7, 1, 5, 3, 6, 4]。你可以多次买卖,但同一时间最多持有一股。目标是最大利润。

profit 计分板

上坡 = 加分
+0/ 终局 +7
profit (before)
+0
profit (after)
+0

Go 解法 · 与动画联动

▶ line 1
i
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 处理一条相邻差价

点击行跳到对应步骤
iprices[i-1]prices[i]diffactionprofit
171-6跳过0
215+4profit += 44
353-2跳过4
436+3profit += 37
564-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),贪心不再成立。