news 2026/9/30 9:52:56

贪心算法专题(四):只赚不赔的股市神话——「买卖股票的最佳时机 II」

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
贪心算法专题(四):只赚不赔的股市神话——「买卖股票的最佳时机 II」

哈喽各位,我是前端小L。

欢迎来到贪心算法专题第四篇! 力扣上关于“买卖股票”的题目有一整个系列(共 6 道)。其中,第 II 题是最适合用贪心算法解决的。

规则是:你可以尽可能地完成更多的交易(多次买卖一支股票),但你手里最多只能持有一支股票(再次购买前必须卖出之前的)。

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

https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/

题目分析:

  • 输入:价格数组prices。

  • 目标:通过多次买卖,获得最大利润。

  • 例子:[7, 1, 5, 3, 6, 4]

    • 在第 2 天(价格1)买入,第 3 天(价格5)卖出,赚4。

    • 在第 4 天(价格3)买入,第 5 天(价格6)卖出,赚3。

    • 总利润:4 + 3 = 7。

核心思维:利润分解

大家可能会想:我是不是要找到一个局部的最低点买入,然后再找一个局部的最高点卖出? 比如1 -> 5,我是不是应该持有 4 天?

贪心思维的魔法:我们可以把“长线的利润”分解为“每天的利润”。 假如第 0 天买,第 3 天卖,价格是prices[0]和prices[3]。 利润 =prices[3] - prices[0]。 数学上,它等价于:prices[3] - prices[0] = (prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])

这意味着:“第 0 天买、第 3 天卖”的利润,等同于“第 0 天买第 1 天卖” + “第 1 天买第 2 天卖” + “第 2 天买第 3 天卖”的总和。

贪心策略:我们只需要遍历数组,计算每一天相对于前一天的差值:

  • 如果差值是正数(今天涨了):收下这个利润!(就当昨天买今天卖了)。

  • 如果差值是负数(今天跌了):不要!(我就当没操作)。

我们不需要考虑什么时候卖出,我们只需要把所有的正利润片段收集起来,就是全局最大利润!

算法流程

  1. 初始化:result = 0。

  2. 遍历数组:从第 1 天开始(下标 1)一直到最后。

  3. 计算差值:diff = prices[i] - prices[i-1]。

  4. 贪心收集:

    • if (diff > 0):result += diff。

  5. 返回result。

代码实现 (C++)

C++

#include <vector> using namespace std; class Solution { public: int maxProfit(vector<int>& prices) { int result = 0; // 从第二天开始遍历 for (int i = 1; i < prices.size(); i++) { // 今天的利润 = 今天的价格 - 昨天的价格 int dailyProfit = prices[i] - prices[i-1]; // 贪心策略:只收集正利润 // 只要涨了,我就赚这笔钱;如果跌了,我就不参与 if (dailyProfit > 0) { result += dailyProfit; } } return result; } };

深度辨析:为什么能这么做?

有人会问:“如果我昨天买了,今天涨了,我卖了。但明天又涨了,我手里没股票了怎么办?”

别忘了题目规则:当天卖出后,可以当天立刻买入!

  • 比如1 -> 5 -> 10。

  • 贪心做法:

    • 第一段1 -> 5,赚 4。卖出。

    • 第二段5 -> 10,赚 5。买入再卖出。

    • 总赚:4 + 5 = 9。

  • 长线做法:

    • 1买,10卖。总赚:10 - 1 = 9。

结果是一样的! 所以,这种“收集所有正向坡度”的策略,在没有交易手续费、没有交易次数限制的情况下,是绝对的最优解。

深度复杂度分析

  • 时间复杂度:O(N)

    • 只需要遍历一次数组。

  • 空间复杂度:O(1)

    • 只要一个变量。

总结:化繁为简的智慧

这道题展示了贪心算法通过**“数学等价转换”简化问题的能力。 我们将一个需要寻找波峰波谷的复杂决策问题,简化成了一个简单的加法问题**。

  • 只要p[i] > p[i-1],就加!

  • 就这么简单。

下一题预告: 如果我们不是在炒股,而是在玩**“跳跃游戏”。 给你一个数组,每个格子里的数字代表你能向右跳的最大步数**。请问你能否跳到终点? 这道题的贪心策略不再是累加收益,而是维护一个**“最大覆盖范围”**。只要终点在我的覆盖范围内,我就赢了!

下期见!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 8:00:04

STL容器——String容器

STL容器——String容器 基本概念 string是c风格的字符串&#xff0c;不同于c语言的char*&#xff0c;本质是一个类 char*是一个指针&#xff0c;string是一个类&#xff0c;内部封装了char *来管理字符串&#xff0c;是一个char&型的容器 特点&#xff1a;内部封装了查找f…

作者头像 李华
网站建设 2026/9/30 5:49:07

详细分析一下 国富论里里面 十一章 论 地租

《国富论》第十一章《论地租》&#xff08;Of the Rent of Land&#xff09;是亚当斯密对土地收入性质的系统性分析&#xff0c;属于其分配理论的重要组成部分。本章在斯密的理论体系中具有承上启下的作用&#xff0c;既延续了对生产要素报酬&#xff08;工资、利润、地租&…

作者头像 李华
网站建设 2026/9/29 16:13:07

现在 夸脱小麦 多少 盎司白银

根据当前的国际市场价格数据&#xff0c;1夸脱小麦约相当于0.24盎司白银。这个比例与您在《国富论》中读到的历史数据&#xff08;如14世纪约4盎司白银/夸脱&#xff09;相比&#xff0c;已经发生了巨大变化。下面是根据最新市场数据进行的计算和对比分析&#xff1a;&#x1f…

作者头像 李华
网站建设 2026/9/29 23:37:47

Java Web html 图书管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 随着信息技术的快速发展&#xff0c;图书管理系统在图书馆、学校及企业中的应用日益广泛&#xff0c;传统的手工管理模式已无法满足高效、精准的管理需求。数字化图书管理系统能够实现图书信息的快速检索、借阅记录的自动化管理以及用户权限的精细化控制&#xff0c;极大地…

作者头像 李华
网站建设 2026/9/29 16:13:07

半光滑牛顿法非线性优化带35个测试函数 半光滑牛顿法求解非线性目标函数约束优化问题的MATLA...

半光滑牛顿法非线性优化带35个测试函数 半光滑牛顿法求解非线性目标函数约束优化问题的MATLAB自编源代码&#xff0c;不调用MATLAB优化库函数&#xff0c;每个函数开头有简单英语注释&#xff0c;求解速度比MATLAB自带优化库函数快。 目标函数支持非线性目标函数、二次型函数等…

作者头像 李华