代码随想录算法训练营第三十二天,第八章 贪心算法 |122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II

【代码随想录训练营】【Day32】第八章|贪心算法|122.买卖股票的最佳时机II |55. 跳跃游戏|45.跳跃游戏II 阅读详情

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

示例

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

  • 输入: [7,1,5,3,6,4]
  • 输出: 7
  • 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

思路

本题首先要清楚两点:

  • 只有一只股票!
  • 当前只有买股票或者卖股票的操作

想获得利润至少要两天为一个交易单元

贪心算法

这道题目可能我们只会想,选一个低的买入,再选个高的卖,再选一个低的买入…循环反复。
如果想到其实最终利润是可以分解的,那么本题就很容易了!
如何分解呢?
假如第0天买入,第3天卖出,那么利润为:prices[3] - prices[0]。

相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。
此时就是把利润分解为每天为单位的维度,而不是从0天到第3天整体去考虑!
那么根据prices可以得到每天的利润序列:(prices[i] - prices[i - 1])…(prices[1] - prices[0])。

如图:
在这里插入图片描述
从图中可以发现,其实我们需要收集每天的正利润就可以,收集正利润的区间,就是股票买卖的区间,而我们只需要关注最终利润,不需要记录区间。

那么只收集正利润就是贪心所贪的地方!
局部最优:收集每天的正利润,全局最优:求得最大利润。
局部最优可以推出全局最优,找不出反例,试一试贪心!

c++实现

class Solution122 {
public:
    int maxProfit(vector<int>& prices) {
        int result = 0;
        for (int i = 1; i < prices.size(); ++i) {
            result += max(prices[i] - prices[i-1], 0);
        }
        return result;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

55. 跳跃游戏

示例

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

示例 1:

  • 输入: [2,3,1,1,4]
  • 输出: true
  • 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。

思路

刚看到本题一开始可能想:当前位置元素如果是3,我究竟是跳一步呢,还是两步呢,还是三步呢,究竟跳几步才是最优呢?

其实跳几步无所谓,关键在于可跳的覆盖范围!
不一定非要明确一次究竟跳几步,每次取最大的跳跃步数,这个就是可以跳跃的覆盖范围。

这个范围内,别管是怎么跳的,反正一定可以跳过来。

那么这个问题就转化为跳跃覆盖范围究竟可不可以覆盖到终点!
每次移动取最大跳跃步数(得到最大的覆盖范围),每移动一个单位,就更新最大覆盖范围。

贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。

局部最优推出全局最优,找不出反例,试试贪心!

如图:
在这里插入图片描述
i每次移动只能在cover的范围内移动,每移动一个元素,cover得到该元素数值(新的覆盖范围)的补充,让i继续移动下去。
而cover每次只取 max(该元素数值补充后的范围, cover本身范围)。

如果cover大于等于了终点下标,直接return true就可以了。

c++实现

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int cover = 0;
        if (nums.size() == 1) return true; // 只有一个元素,就是能达到
        for (int i = 0; i <= cover; i++) { // 注意这里是小于等于cover
            cover = max(i + nums[i], cover);
            if (cover >= nums.size() - 1) return true; // 说明可以覆盖到终点了
        }
        return false;
    }
};

总结

这道题目关键点在于:不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。

贪心无套路!没有个整体的贪心框架解决一系列问题,只能是接触各种类型的题目锻炼自己的贪心思维!

45.跳跃游戏II

示例

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

  • 输入: [2,3,1,1,4]
  • 输出: 2
  • 解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
    说明: 假设你总是可以到达数组的最后一个位置。

思路

思路与55.跳跃游戏是相似的,还是要看最大覆盖范围。

本题要计算最小步数,那么就要想清楚什么时候步数才一定要加一呢?

贪心的思路,局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最小步数。
思路虽然是这样,但在写代码的时候还不能真的能跳多远就跳多远,那样就不知道下一步最远能跳到哪里了。
所以真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数!

这里需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖。
如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。
如图:
在这里插入图片描述
图中覆盖范围的意义在于,只要红色的区域,最多两步一定可以到!(不用管具体怎么跳,反正一定可以跳到)
从图中可以看出来,就是移动下标达到了当前覆盖的最远距离下标时,步数就要加一,来增加覆盖距离。最后的步数就是最少步数。

这里还是有个特殊情况需要考虑,当移动下标达到了当前覆盖的最远距离下标时

  • 如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。
  • 如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了。

c++实现

class Solution45 {
public:
    int jump(vector<int> &nums) {
        if (nums.size() == 1) return 0;
        int curDistance = 0; // 当前覆盖的范围
        int result = 0;  // 记录走的步数
        int nextDistance = 0; // 下一步覆盖的范围
        for (int i = 0; i < nums.size(); ++i) {
            nextDistance = max(i + nums[i], nextDistance);  // 更新下一步覆盖最远距离下标
            if (i == curDistance) {  // 遇到当前覆盖最远距离下标
                if (curDistance < nums.size() - 1) { // 如果当前覆盖最远距离下标不是终点
                    result++;                        // 需要走下一步
                    curDistance = nextDistance;      // 更新当前覆盖最远距离下标
                    if (curDistance >= nums.size() -1)
                        break;               // 下一步的覆盖范围已经可以达到终点,结束循环

                }
                else
                    break;                    // 当前覆盖最远距到达集合终点,不用做ans++操作了,直接结束
            }
        }
        return result;
    }
};
Vue3多级路由缓存失效的深度解析与实战解决方案 本文深度解析了Vue3项目中多级路由嵌套下keep-alive缓存失效的根本原因,并提供了三种实战解决方案。通过剖析组件树、router-view与keep-alive的协作机制,揭示了缓存无法穿透多层router-view的技术本质。文章对比了路由扁平化重构、状态管理配合路由守卫以及使用社区插件等方案的优缺点与适用场景,为开发者解决这一常见难题提供了清晰的选型指导。 阅读详情

相关推荐

生成式引擎优化(GEO)的概念与技术路径

生成式引擎优化(GEO)是针对生成式AI引擎的新型优化策略,旨在提升内容在AI搜索与问答平台中的可见性和可信度。与传统SEO相比,GEO更注重语义理解、知识图谱和多模态生成等技术,通过优化内容的结构化和平台适配性,使品牌信息在生成式AI中更易被采纳和呈现。其核心技术包括语义理解、向量数据库和实时反馈优化等,应用于品牌传播、智能客服和个性化推荐等领域。随着AI技术发展,GEO将向智能化、自动化方向演进,成为内容优化的重要工具。

Baixue5209的博客 1047

代码随想录算法训练营第三十二天_第八章_贪心算法 | 122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II

代码随想录算法训练营2023_1_7

Jane_10358的博客 179

SAP PCE私有云MM02修改物料主数据基本单位报错

当前发现只有改为AAAADL(无量纲)单位时会报错,其他的正常。一开始以为配置的ISO码换算有问题,对配置排查后,排除配置问题。最后发现是PCE当前版本的原因,需要打上NOTE。SAP PCE私有云在没有库存和业务单据的情况下,MM02修改物料主数据基本单位报错“EA CPZP MK000000000000:PCS 不可转换为”,详见截图。点击【显示错误】,提示EA CPZP MK000000000000:PCS 不可转换为。从SAP FOR ME下载NOTE 3531359,链接。

dingqing86的专栏 519

代码随想录算法训练营第三十二天| 第八章 贪心算法:122.买卖股票的最佳时机II,55.跳跃游戏,45.跳跃游戏II(python)

代码随想录算法训练营第三十二天| 第八章 贪心算法:122.买卖股票的最佳时机II,55.跳跃游戏,45.跳跃游戏II(python)

weixin_40894831的博客 127

windows的rancherDesktop修改镜像源

Rancher Desktop中的“Allowed Images”功能(通常在 Preferences -> Container Engine -> Allowed Images 中找到)是用来定义一个允许拉取和推送的镜像列表的规则,例如,只允许从您组织或特定的受信任的仓库中获取镜像。如果问题依旧,请提供您Rancher Desktop的版本和当前选择的容器运行时,以便进一步协助。总结一下,对于Windows上的Rancher Desktop,如果您使用默认的。,镜像源的配置通常通过一个名为。

zwjapple的专栏 2695

黑猫带你学eMMC协议第11篇:eMMC擦除详解(erase/trim/discard/sanitize/secure erase/secure trim...)

erase命令单位是擦除组,那么一个擦出组包含多个写块,不同写块有不同信息,主机擦除之前,必须进行确定好这些写块中的信息没有用了。所以通常erase用来擦除整个设备或分区。erase完成后,将erase的区域都要么是全0,要么是全1。那么到底是0还是1呢,根据不同的工艺有所不同,但是别担心,在ecsd[181]中会有说明到底是1还是0。erase命令的作用就是简单的将映射地址范围移动到未映射的地址范围。

黑猫奥利奥的博客 7794

【代码随想录算法训练营Day32】122.买卖股票的最佳时机II;55.跳跃游戏;45.跳跃游戏II

如果移动下标等于当前覆盖最大距离下标, 需要再走一步(即 ans++),因为最后一步一定是可以到的终点。从图中可以发现,其实我们需要收集每天的正利润就可以,收集正利润的区间,就是股票买卖的区间,而我们只需要关注最终利润,不需要记录区间。针对于方法一的特殊情况,可以统一处理,即:移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不考虑是不是终点的情况。从图中可以看出来,就是移动下标达到了当前覆盖的最远距离下标时,步数就要加一,来增加覆盖距离。总结:每次只走一步,求当前数可以覆盖到的范围,取最大的范围。

Tammy2001的博客 1045

14、方法论 - 自顶向下与自底向上的结合

本文探讨了如何将自顶向下的规范驱动方法与自底向上的组件构建方法相结合,以形成更加全面的编程理论。通过引入代数法则,简化逻辑关系、提高代码可读性并支持形式化验证,结合实际案例(如智能家居控制系统)展示了如何在设计和实现阶段确保系统的正确性和可靠性。文章还讨论了工具支持的重要性,并提出了未来发展的方向。

lstm7chronicler的博客 173

代码随想录算法训练营第24天 | 第八章 贪心算法 part02

第八章 贪心算法 part02122. 买卖股票的最佳时机 II 55. 跳跃游戏 45. 跳跃游戏 II 1005. K 次取反后最大化的数组和 学习了lambda函数

zxjiaya的博客 844

AI大模型入门到实战系列(二十一)命名实体识别(NER)

命名实体识别(NER)是自然语言处理中的关键任务,旨在从文本中识别并分类预定义类别的实体(如人名、地点、组织等)。其核心步骤包括文本预处理、实体边界检测和类型分类。主流技术方法经历了从基于规则、统计机器学习到深度学习的演进,当前主要采用预训练语言模型(如BERT)和序列标注技术(如BiLSTM-CRF)。关键技术挑战包括实体边界模糊、嵌套实体和领域适应等问题。NER广泛应用于信息抽取、搜索引擎优化和知识图谱构建等领域,常用精确率、召回率和F1值作为评估指标。实际应用中通常采用BIO标注体系,并通过标签对齐处

echo的博客 1622

定位教程0---定位初介绍

定位教程0---定位算子介绍

Quintin 1万+

代码随想录算法训练营第32天|122.买卖股票的最佳时机II |55. 跳跃游戏 |45.跳跃游戏II

本题同样不容易想出来。贪心就是这样,有的时候 会感觉简单到离谱,有时候,难的不行,主要是不容易想到。本题如果没接触过,很难想到,所以不要自己憋时间太久,读题思考一会,没思路立刻看题解。本题解法很巧妙,大家可以看题思考一下,在看题解。第八章 贪心算法 part02。

2401_83080774的博客 864

华为OD机试真题 新系统2026-04-15 C++ 实现【失灵的键盘】

有一个键盘有2个按键失灵了,按下这些键时会连续输出其他键对应的字符两次。具体如下: 1. 按下j键一次,屏幕上显示uu(两个连续的u);  按下b键一次,屏幕上显示t(两个连续的t) 2. u键和t键是好的,按下u键一次时,屏幕只会显示一次u(正常按键);按下t键一次时,屏幕只会显示一次t(正常按键) 3. 假定屏幕上连续显示两个t一定是按了一次b键,而不是两次t键;假定按键t之后不会紧接着按键b,即tttt转义为两个b,而不可能是tb

MISAYAONE的博客 210

代码训练营 day32|LeetCode 122,LeetCode 55,LeetCode 45,LeetCode 1005

今天主要学习了贪心的一系列操作,感觉贪心确实是简单的很简单,难的很难。加油,坚持打卡的第32天。

qq_44639909的博客 1099

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

代码随想录-算法训练营day32(贪心算法02:买卖股票的最佳时机2,跳跃游戏,跳跃游戏2)

贪心算法02

weixin_61931006的博客 536

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

代码随想录-算法训练营day32【贪心算法02:买卖股票的最佳时机II、跳跃游戏】

代码随想录-算法训练营day32【贪心算法02:买卖股票的最佳时机II、跳跃游戏】

upward 571

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

代码随想录算法训练营|day32

从i位置出发,dp[i] = nums[i] + i;不从i位置出发dp[i] = dp[i - 1]当前位置为i时,下一跳的可扩展边界为j,如果下一跳位置从未到达过,dp[j]=dp[i]+1。(1)贪心:若当前位置是能走到的最远位置离,count++,更新下一个能走到的最远位置。若下一跳能跳到的最远位置为当前位置,不能往前走了。dp[i]:[0,i]范围内任意位置,下一跳可以跳到的最远位置。若数组长度大于1,但是nums[0] == 0,无法继续前进;的最小次数 + 1,当前位置的最小跳跃次数)

weixin_43785190的博客 639

代码随想录训练营day32

相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。所以真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!从图中可以发现,其实我们需要收集每天的正利润就可以,收集正利润的区间,就是股票买卖的区间,而我们只需要关注最终利润,不需要记录区间。如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。

chaizihao111的博客 603

代码随想录算法训练营第32天|第八章 贪心算法 part02|122.买卖股票的最佳时机II ,55. 跳跃游戏 ,45.跳跃游戏II

你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。你的目标是使用最少的跳跃次数到达数组的最后一个位置。给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。说明: 假设你总是可以到达数组的最后一个位置。

weixin_60755436的博客 312

代码随想录算法训练营第三十二天|122. 买卖股票的最佳时机 II、55. 跳跃游戏、45. 跳跃游戏 II

思路:记录当前可以购买价格,如果价格更低则选择更高的价格,如果价格更高则抛出,获得收益。做到这道题好像可以理解贪心算法的核心:局部最优从而全局最优。思路:一直想着局部最优然后就按着寻找每一步能跳到的最大下标位置然后继续找,一直报错,没有想到将最大坐标作为遍历最大范围去设置就不会缺漏。在每一天,你可以决定是否购买和/或出售股票。数组中的每个元素代表你在该位置可以跳跃的最大长度。贪心算法确实没有什么模板,只能根据实际问题去分析。判断你是否能够到达最后一个下标,如果可以,返回。你也可以先购买,然后在。

qq_63241956的博客 180

代码随想录算法训练营天 第八章 三十二天| 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II

代码随想录算法训练营天 第八章 三十二天| 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II

贝塔的博客 217

代码随想录算法训练营第32天 |第八章 贪心算法 part02

- [x] 122.买卖股票的最佳时机II - [x] 55. 跳跃游戏 - [ ] 45.跳跃游戏II

qq_43750923的博客 585

代码随想录算法训练营第32天| 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II

今日学习的文章链接,或者视频链接。今日收获,记录一下自己的学习时长。自己实现过程中遇到哪些困难。看完代码随想录之后的想法。自己看到题目的第一想法。

taohuaak47的博客 395

代码随想录算法训练营Day28

本题同样不容易想出来。贪心就是这样,有的时候 会感觉简单到离谱,有时候,难的不行,主要是不容易想到。本题如果没接触过,很难想到,所以不要自己憋时间太久,读题思考一会,没思路立刻看题解。本题简单一些,估计大家不用想着贪心 ,用自己直觉也会有思路。本题大家可以先自己思考一下然后再看题解,会有惊喜!1005.K次取反后最大化的数组和。122.买卖股票的最佳时机II。第八章 贪心算法 part02。

Tomatos_baby的博客 163

代码随想录算法训练营第32天| 122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II

今日学习的文章链接,或者视频链接。今日收获,记录一下自己的学习时长。自己实现过程中遇到哪些困难。看完代码随想录之后的想法。自己看到题目的第一想法。

taohuaak47的博客 196

代码随想录算法训练营DAY28第八章 贪心算法 part02

一开始想的是前缀和,后来打草稿发现是相邻差,验证了发现样例中没有反例,结果通过了。

2401_88089822的博客 215
上一篇: 代码随想录算法训练营第三十一天,第八章 贪心算法 |455.分发饼干 376. 摆动序列 53. 最大子序和
下一篇: 代码随想录算法训练营第三十四天,第八章 贪心算法 | 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果
CV-ROBOT
博客等级 码龄9年 47粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值