当前位置: 首页 > news >正文

【Hot 100 刷题计划】 LeetCode 45. 跳跃游戏 II | C++ 贪心算法最优解题解

LeetCode 45. 跳跃游戏 II | C++ 动态规划与贪心 O(N) 双解法题解

📌 题目描述

题目级别:中等

给定一个长度为n0 索引整数数组nums。初始位置在下标 0。
每个元素nums[i]表示从索引i向后跳转的最大长度。
返回到达n - 1最小跳跃次数。测试用例保证可以到达n - 1

  • 示例 1:
    输入:nums = [2,3,1,1,4]
    输出:2
    解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

💡 解题思路与代码实现

这道题求的是“最少步数”,很自然会让人想到动态规划(求极值)。但如果想要追求极致的性能,我们需要利用跳跃游戏的特殊性质,使用贪心算法进行降维打击。

🚀 解法一:动态规划 (思路直观,易于理解)

核心思想
我们开辟一个dp数组,dp[i]表示到达索引i需要的最少跳跃次数。
初始状态dp[0] = 0,其余全部初始化为无穷大。
遍历数组,站在位置i时,我们把它能跳到的所有未来位置j都更新一遍:dp[j] = min(dp[j], dp[i] + 1)

💻 C++ 代码实现
classSolution{public:intjump(vector<int>&nums){intn=nums.size();vector<int>dp(n,0x3f3f3f3f);// 初始化为无穷大dp[0]=0;// 起点不需要跳跃for(inti=0;i<n;i++){// 遍历从当前位置 i 能够跳到的所有位置 jfor(intj=i+1;j<=i+nums[i]&&j<n;j++){dp[j]=min(dp[j],dp[i]+1);}}returndp[n-1];}};

🏆 解法二:贪心算法 (时间 O(N),大厂面试终极解)

既然是跳跃,我们其实不需要挨个更新后面的格子。我们可以把跳跃看作是一次次扩大势力范围的过程。

核心机制:

我们维护两个变量:farthestfarthestfarthest(当前接触过的所有点中,能跳到的最远距离) 和currentendcurrent_{end}currentend(当前这一步所能覆盖的右边界)。

遍历数组,每经过一个格子iii,我们就尝试用它去刷新farthestfarthestfarthest

灵魂转折点:当我们遍历到currentendcurrent_{end}currentend时,说明“当前这一步的潜力已经全部榨干了”。为了继续往前走,我们被迫必须进行下一次跳跃。于是跳跃次数jumps++jumps++jumps++,并把下一步的边界currentendcurrent_{end}currentend更新为刚才探索到的最远距离farthestfarthestfarthest

💻 进阶 C++ 代码实现
classSolution{public:intjump(vector<int>&nums){intjumps=0;// 记录跳跃次数intcurrent_end=0;// 记录当前这一跳的最远边界intfarthest=0;// 记录在当前边界内,能探索到的全局最远距离// 注意:这里 i < nums.size() - 1,因为到了终点就不需要再跳了for(inti=0;i<nums.size()-1;i++){// 贪心:在前进的过程中,不断刷新能到达的最远距离farthest=max(farthest,i+nums[i]);// 如果走到了当前这一跳的边界if(i==current_end){jumps++;// 必须进行下一次跳跃current_end=farthest;// 更新下一跳的边界}}returnjumps;}};
http://www.cnnetsun.cn/news/1749511.html

相关文章:

  • 薪资10-50K!AI行业红利爆发,普通人如何抓住风口?高薪岗位等你来!
  • 【NLP实战指南】FUNSD数据集:表单理解与结构化数据生成的挑战与机遇
  • C语言goto语句的争议与现代替代方案
  • LangGraph 为什么成为 Multi-Agent 编排的事实标准
  • BepInEx:为Unity游戏打造强大插件生态的实践指南
  • CarSim与Simulink联合仿真失败排查指南:从COM接口到路径配置
  • 从零到一:用Python打造你的专属桌面宠物,附完整源码与exe打包指南
  • 精选7款免费商用中文字体:思源宋体从安装到精通全攻略
  • 3步驯服笔记本风扇:G-Helper让散热与性能达到完美平衡
  • 电子元器件失效分析与预防指南
  • 如何正确对 JavaScript 对象的键进行字母序排序
  • AI建站工具从0到1全流程:企业官网搭建保姆级攻略
  • python confluence
  • 基于单片机的车辆防盗系统(有完整资料)
  • PolyServo:基于中断的软件PWM多路伺服控制库
  • 高效掌控窗口尺寸:WindowResizer的完整使用指南
  • HR 系统怎么选?从功能、适配到性价比全维度解析
  • 2026届学术党必备的五大AI学术助手推荐
  • 基于FPGA的温度采集系统工程:Max6675驱动源码与QT控制软件工程代码
  • c++ 享元模式实现 c++如何运用共享技术有效支持大量细粒度对象
  • 2026年深度解读:Qwen3.6-Plus的MoE重构、500K超长上下文与工程落地实践
  • Rust交叉编译的终极简化:如何用rustup轻松管理多平台target
  • matlab anybody opensim包括人机耦合建模、缩放、运动学_逆动力学分析,以及自由度扩建、肌肉重建、RRA_CMC仿真,从理论到代码手把手教会运动生物力学数据代处理
  • YOLOv5目标检测辅助DeepSeek-OCR-2文档分析
  • HR整理面试录像必看!2026年4款网络视频转文字软件,10分钟输出完整面试纪要
  • 网站 SEO 优化推广效果如何评估
  • 突破音乐版权限制:XiaoMusic让小爱音箱实现自由播放
  • SEO数据分析资源网
  • 深度学习第三章,线性表示
  • 03-Linux网络故障排查:从DNS配置到防火墙设置的全面指南