122. 买卖股票的最佳时机 II

难度:中等 | 主题:贪心——累加正差价

题目

给定数组 prices,可以无限次买卖(但不能同时持有)。每次买卖赚差价,求最大总利润。

示例:

 
[7,1,5,3,6,4] → 7
 
第 2 天买第 3 天卖(+4),第 4 天买第 5 天卖(+3),总利润 7
 

思路

先讲个故事:菜市场的鱼贩

你是菜市场鱼贩,每天鱼价都在变。你可以每天买卖无数次,但不能空手套白狼——手里没鱼就不能卖。

你发现一个规律:只要今天比昨天贵,昨天买今天卖就能赚。虽然单次赚得不多,但积少成多。

关键是你不需要预测未来,只需要看相邻两天就够了。


引导式推导:从峰谷到累加

直觉误区:很多人想找”谷底买、峰顶卖”,但这需要知道未来走势。

正确的贪心:只要 prices[i] > prices[i-1],就在 i-1 买入、i 卖出。把所有正差价累加。

 
for i in range(1, len(prices)):
 
    if prices[i] > prices[i-1]:
 
        profit += prices[i] - prices[i-1]
 

为什么等价于峰谷策略?

累加所有上涨段 = 在谷底买入、峰顶卖出。因为中间的回调被拆成了”卖出再买入”。


graph LR

    subgraph 贪心累加

        A["prices[i-1]=1"] --> B["prices[i]=5<br/>+4"]

        B --> C["prices[i+1]=3<br/>不操作"]

        C --> D["prices[i+2]=6<br/>+3"]

    end


代码

 
def maxProfit(self, prices):
 
    profit = 0
 
    for i in range(1, len(prices)):
 
        if prices[i] > prices[i-1]:
 
            profit += prices[i] - prices[i-1]
 
    return profit
 

复杂度

指标解释
时间O(n)遍历一次
空间O(1)一个变量

实战考量

频率分析

贪心入门题,常作为 121 的追问出现,考察对问题性质的洞察。

延伸思考

Q:为什么不需要找峰谷?

A:因为可以当天卖出再买入。连续上涨的每一天都可以赚差价,累加等价于在谷底买、峰顶卖。

Q:如果只能交易一次呢?

A:→ 121买卖股票的最佳时机,维护最低价和最大差值。

Q:如果最多交易 k 次呢?

A:DP 状态机,dp[i][k][0/1] 表示第 i 天交易 k 次后持有/不持有的最大利润。

Q:如果有冷冻期呢?

A:→ 309最佳买卖股票时机含冷冻期,卖出后第二天不能买入。

易错点

  • 不需要同时持有才能卖,每次正差值独立累加

  • 不是找峰谷差值,是所有正差值之和


生活类比

鱼贩子 → 累加正差价

你不需要知道鱼价会不会涨到天上去。

只要今天比昨天贵 1 块,你就赚这 1 块。

明天比今天又贵 1 块,再赚 1 块。

积小胜为大胜,就是 II 和 I 的本质区别。


相关题目

题目关系
121买卖股票的最佳时机只能交易一次
123买卖股票的最佳时机III最多两次
309最佳买卖股票时机含冷冻期含冷冻期,状态机 DP
714买卖股票的最佳时机含手续费含手续费,状态机 DP

→ 返回题单:LeetCode学习路线图 > 十一、贪心

速记卡(面试闪卡)

Q1:一句话讲清「122. 买卖股票的最佳时机 II」到底是什么?

A:可无限次买卖,把所有上涨的正差价累加就是最大利润。

Q2:题目 —— 怎么理解?

A:像鱼贩积少成多:给价格数组,可无限次买卖(但不能同时持有),每次赚差价求最大总利润。示例 [7,1,5,3,6,4] → 7(第2天买第3天卖+4,第4天买第5天卖+3)。

Q3:思路 —— 怎么理解?

A:像每天赚差价:不用找谷底峰顶(那要预知未来)。只要 prices[i]>prices[i-1],就在 i-1 买、i 卖,把所有正差价累加。因为可当天卖再买,连续上涨拆成每天赚,累加等价于谷底买峰顶卖。

Q4:代码 —— 怎么理解?

A:profit=0;for i in 1..n:if prices[i]>prices[i-1]:profit+=prices[i]-prices[i-1]。两行搞定,时间 O(n) 空间 O(1)。

Q5:复杂度 —— 怎么理解?

A:像走一趟:时间 O(n) 遍历一次;空间 O(1) 只一个变量。与 121(只能一次,维护最低价最大差)、123(最多两次)、309(冷冻期)是同族变体。

Q6:核心速记主线有哪些?

  • 贪心:所有相邻正差价累加,等价于谷买峰卖

  • 不需要预测未来,只看相邻两天

  • 与 121/123/309/714 是同族状态机/DP 变体

  • 时间 O(n)、空间 O(1)

口诀

A:股票二期限多次,

正差累加就是利;

不必找顶和底,

相邻贵了就赚起。

相关链接