ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

LeetCode122. 买卖股票的最佳时机 II:贪心策略实现最大利润

LeetCode122. 买卖股票的最佳时机 II:贪心策略实现最大利润

在股票交易类算法题中,力扣122题「买卖股票的最佳时机 II」是经典的贪心算法应用场景。这道题的核心要求是:允许在任意天数买入和卖出股票(可多次交易),求能获得的最大利润。本文将从题目分析、思路推导、代码实现到复杂度分析,完整拆解这道题的最优解法。

一、题目理解

题目描述

给你一个整数数组 `prices` ,其中 `prices[i]` 表示某支股票第 `i` 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候最多只能持有一股股票。你也可以先购买,然后在同一天出售。返回你能获得的最大利润 。

核心规则拆解

题目隐含的最优交易策略可以简化为:

  • 从第2天开始,若当天股价 > 前一天股价,说明存在盈利空间:在前一天买入,当天卖出,赚取差价;

  • 若当天股价 ≤ 前一天股价,无盈利空间,不进行任何操作;

  • 所有上涨交易日都进行买卖,下跌/持平交易日不操作,最终利润即为最大值。

举个直观例子:

假设 `prices = [7,1,5,3,6,4]`,交易过程如下:

  • 第2天(价格1)< 第1天(价格7)→ 不操作;

  • 第3天(价格5)> 第2天(价格1)→ 买入第2天、卖出第3天,利润 `5-1=4`;

  • 第4天(价格3)< 第3天(价格5)→ 不操作;

  • 第5天(价格6)> 第4天(价格3)→ 买入第4天、卖出第5天,利润 `6-3=3`;

  • 第6天(价格4)< 第5天(价格6)→ 不操作;

  • 总利润:`4+3=7`,为该案例的最大利润。

二、解题思路:贪心算法

贪心策略核心

贪心算法的关键是「局部最优推导全局最优」。对于本题,每天的最优决策就是:只要当天股价比前一天高,就赚取这部分差价;否则不操作。把所有单日的正差价累加,最终结果就是全局最大利润。

思路推导

  1. 初始化利润 `profit = 0`;

  2. 遍历股价数组(从第2天开始,即索引1);

  3. 对于每个交易日 `i`,计算 `prices[i] - prices[i-1]`:

    1. 若差值 > 0,说明盈利,将差值加入总利润;

    2. 若差值 ≤ 0,说明无盈利,跳过;

  4. 遍历结束后,总利润即为最大值。

三、代码实现

完整代码实现(Java)

class Solution { public int maxProfit(int[] prices) { int ans = 0; for (int i = 1; i < prices.length; i++){ if(prices[i] > prices[i-1]){ ans += prices[i] - prices[i-1]; } } return ans; } }

四、复杂度分析

时间复杂度

遍历一次股价数组,遍历次数为 `n-1`(`n` 为数组长度),因此时间复杂度为O(n)。

空间复杂度

仅使用了常量级的额外空间,未开辟新的数组或容器,因此空间复杂度为O(1)

总结

  1. LeetCode122题的核心解法是贪心算法,通过“累加所有单日正差价”实现全局最大利润;

  2. 算法时间复杂度O(n)、空间复杂度O(1),是理论最优解;

  3. 贪心策略的关键是“局部最优”:只要当天股价比前一天高,就赚取该部分差价,最终累加结果即为全局最优。

这道题的核心启示是:在允许多次交易的股票问题中,无需纠结“长期持有”,抓住每一次短期盈利的机会,最终就能获得最大收益。这种“见好就收”的贪心思路,也是算法中局部最优推导全局最优的典型应用。

返回列表