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

【力扣100题】96.跳跃游戏 II

题目描述

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

示例 1:

输入:nums = [2,3,1,1,4] 输出:2 解释:从下标 0 跳到下标 1(跳 1 步),再从下标 1 跳到下标 4(跳 3 步)

示例 2:

输入:nums = [2,3,0,1,4] 输出:2

解题思路总览

思路时间复杂度空间复杂度适用场景
动态规划O(n^2)O(n)通用但慢
BFSO(n^2)O(n)需要队列
贪心(反向)O(n)O(1)最优解之一
贪心(正向)O(n)O(1)最优解之一

算法一:动态规划

思路

dp[i]表示到达位置 i 所需的最小跳跃次数。转移方程:

  • dp[i] = min(dp[j] + 1),其中 j < i 且 j + nums[j] >= i

代码

classSolution{public:intjump(vector<int>&nums){intn=nums.size();vector<int>dp(n,INT_MAX);dp[0]=0;for(inti=1;i<n;i++){for(intj=0;j<i;j++){if(j+nums[j]>=i){dp[i]=min(dp[i],dp[j]+1);}}}returndp[n-1];}};

算法流程

输入: nums = [2,3,1,1,4], n=5 dp[0] = 0 i=1: j=0, 0+nums[0]=0+2=2 >= 1, dp[1]=dp[0]+1=1 dp[1]=1 i=2: j=0, 0+2=2 >= 2, dp[2]=dp[0]+1=1 j=1, 1+3=4 >= 2, dp[2]=min(1, dp[1]+1=2)=1 dp[2]=1 i=3: j=0, 0+2=2 < 3, 不满足 j=1, 1+3=4 >= 3, dp[3]=dp[1]+1=2 j=2, 2+1=3 >= 3, dp[3]=min(2, dp[2]+1=2)=2 dp[3]=2 i=4: j=0, 0+2=2 < 4, 不满足 j=1, 1+3=4 >= 4, dp[4]=dp[1]+1=2 j=2, 2+1=3 < 4, 不满足 j=3, 3+1=4 >= 4, dp[4]=min(2, dp[3]+1=3)=2 dp[4]=2 输出: 2

复杂度分析

复杂度分析
时间复杂度O(n^2)
- 两层循环
空间复杂度O(n)

算法二:BFS

思路

从起点开始 BFS,每一层代表一次跳跃,遍历当前层所有能到达的位置,更新下一层的可达范围。

代码

classSolution{public:intjump(vector<int>&nums){intn=nums.size();intans=0;intcurEnd=0;// 当前跳跃的边界intnextEnd=0;// 下一层跳跃的边界for(inti=0;i<n-1;i++){nextEnd=max(nextEnd,i+nums[i]);if(i==curEnd){ans++;curEnd=nextEnd;}}returnans;}};

算法流程

输入: nums = [2,3,1,1,4], n=5 初始: ans=0, curEnd=0, nextEnd=0 i=0: nextEnd = max(0, 0+2) = 2 i == curEnd(0), ans++, ans=1, curEnd = nextEnd(2) 当前层结束,跳跃次数=1 i=1: nextEnd = max(2, 1+3) = 4 i != curEnd(2), 不做处理 i=2: nextEnd = max(4, 2+1) = 4 i != curEnd(2), 不做处理 i=3: nextEnd = max(4, 3+1) = 4 i == curEnd(2), ans++, ans=2, curEnd = nextEnd(4) 当前层结束,跳跃次数=2 循环结束(i 只到 n-2=3,因为最后一步不需要再跳) curEnd(4) >= n-1(4),说明已经能到达终点 输出: ans = 2

复杂度分析

复杂度分析
时间复杂度O(n)
- 每个位置只遍历一次
空间复杂度O(1)

算法三:贪心(反向查找)

思路

从后往前找,每一步找「能跳到当前位置」的最左边的位置,直到起点。

代码

classSolution{public:intjump(vector<int>&nums){intans=0;intpos=nums.size()-1;while(pos>0){for(inti=0;i<pos;i++){if(i+nums[i]>=pos){pos=i;ans++;break;}}}returnans;}};

算法流程

输入: nums = [2,3,1,1,4], n=5, pos=4, ans=0 第一步: pos=4, 从 i=0 开始找能跳到 4 的位置 i=0: 0+2=2 < 4, 不满足 i=1: 1+3=4 >= 4, pos=1, ans=1 找到,跳到 pos=1 第二步: pos=1, 从 i=0 开始找能跳到 1 的位置 i=0: 0+2=2 >= 1, pos=0, ans=2 找到,跳到 pos=0 pos=0, 循环结束 输出: ans = 2

复杂度分析

复杂度分析
时间复杂度O(n)
- 平均一次遍历,最坏 O(n^2)
空间复杂度O(1)

算法四:贪心(正向,最优解)

思路

维护curEnd(当前跳跃可达的边界)和nextEnd(下一次跳跃可达的最远位置)。当遍历到curEnd时,说明需要再跳一次,ans++并更新curEnd = nextEnd

代码

classSolution{public:intjump(vector<int>&nums){intans=0;intcurEnd=0;// 当前跳跃的右边界intnextEnd=0;// 下一步能到的最远位置for(inti=0;i<nums.size()-1;i++){nextEnd=max(nextEnd,nums[i]+i);if(i==curEnd){ans++;curEnd=nextEnd;}}returnans;}};

算法流程

输入: nums = [2,3,1,1,4] 初始: ans=0, curEnd=0, nextEnd=0, n=5 i=0: nextEnd = max(0, 0+2) = 2 i(0) == curEnd(0), ans++ (ans=1), curEnd = nextEnd(2) 第一次跳跃完成 i=1: nextEnd = max(2, 1+3) = 4 i(1) != curEnd(2), 不做处理 i=2: nextEnd = max(4, 2+1) = 4 i(2) != curEnd(2), 不做处理 i=3: nextEnd = max(4, 3+1) = 4 i(3) == curEnd(2), ans++ (ans=2), curEnd = nextEnd(4) 第二次跳跃完成 循环结束(i 只到 n-2=3,因为最后一步不需要再跳) 输出: ans = 2

复杂度分析

复杂度分析
时间复杂度O(n)
- 一次遍历
空间复杂度O(1)

复杂度对比总结

思路平均时间最坏时间空间评价
动态规划O(n^2)O(n^2)O(n)会超时
BFSO(n^2)O(n^2)O(n)需要队列
贪心(反向)O(n)O(n^2)O(1)最坏 O(n^2)
贪心(正向)O(n)O(n)O(1)最优

贪心正向核心思想

nums = [2,3,1,1,4] 遍历过程: +-------------------------------------------------------------+ | 下标 | 能跳到的最远 | curEnd | nextEnd | 跳跃次数 | | | 0 | 2 | 0 | 2 | 1 | 第一次跳 | | 1 | 4 | 2 | 4 | | 更新next | | 2 | 3 | 2 | 4 | | | | 3 | 4 | 2 | 4 | 2 | 第二次跳 | | 4 | - | - | - | | | +-------------------------------------------------------------+ 核心思想: - curEnd:当前这一次跳跃能达到的最远边界 - nextEnd:下一次跳跃能达到的最远边界 - 当 i 到达 curEnd 时,必须再跳一次 - 每次跳跃 ans++

面试追问 FAQ

问题回答
为什么只需要遍历到n-1因为到达n-1不需要再跳,最后一步是「落地」不是「跳跃」
if (i == curEnd)是什么意思?当 i 到达当前跳跃的边界时,必须再跳一次才能继续往前走
如果nums[i] + inextEnd还小?max(nextEnd, nums[i] + i)保证nextEnd总是取最大值
这个算法和 BFS 有什么关系?本质是 BFS 的层序遍历,只是用两个变量代替了队列
如果某个位置nums[i] == 0怎么办?如果i == curEndi < n-1,说明卡住了,但题目保证可达

相关题目

题目难度核心点
55. 跳跃游戏中等判断能否到达,本题的前置题
45. 跳跃游戏 II中等求最小跳跃次数,本题
1306. 跳跃游戏 III中等带限制的跳跃

总结

项目内容
核心思想贪心:维护「当前边界」和「下一步最远」两个变量
关键判断i == curEnd 时,需要再跳一次
最优时间O(n)
最优空间O(1)
面试加分能解释这是 BFS 层序遍历的空间优化版本

http://www.jsqmd.com/news/1013686/

相关文章:

  • 实测避坑:用GPT-4All离线跑代码和文案,8G和13B模型到底哪个更靠谱?
  • 操作系统安全与端侧 AI 推理:从 TEE 到模型加密的防护链路
  • 2026年6月衢州GEO优化排名更新:谁是本地精准获客第一梯队? - 936品牌测评网
  • 联发科设备终极解锁指南:用MTKClient掌控你的设备底层
  • 欧米茄官方售后服务中心全攻略:全国网点、服务流程与联系方式(2026年6月最新) - 资讯速览
  • 2026年6月14日合肥黄金铂金K金钻石回收哪家靠谱 五大正规实体店排行榜实测推荐典典金奢无套路当面结款 - 资讯速览
  • 英雄联盟Akari助手:5分钟打造你的专属智能游戏伴侣
  • 2026金华GEO优化哪家强?技术实力+客户效果双维度深度解析 - 936品牌测评网
  • 2026 年 GEO软文发稿平台推荐|实测排名、选型理由、分场景方案与行业避坑全指南 - 资讯速览
  • 长沙配眼镜多少钱?不同预算的功能镜片全方案参考 - 配眼镜新资讯
  • 【多智能体控制】未知非线性仿射多智能体系统在扰动条件下数据驱动迭代学习积分滑动模式形成控制【含Matlab源码 15623期】
  • 别再傻傻分不清了!一文搞懂RTK和CORS在无人机测绘、自动驾驶里的真实用法
  • 实测对比:在aardio里画图,用原生控件、GDIPlus还是封装ScottPlot更香?
  • 终极Cursor试用重置方案:免费高效突破AI编程工具使用限制
  • 5个SillyTavern性能优化技巧:让你的LLM前端响应速度提升300%
  • MAA Assistant Arknights:明日方舟智能自动化助手深度解析与实战指南
  • 亨得利名表官方售后服务体系全解析(2026年6月最新版) - 资讯速览
  • 全链条赋能多业态高质量发展-筑牢速冻果茶包供应链标杆 - 资讯速览
  • 开源阅读鸿蒙版实战手册:构建你的专属跨设备数字阅读生态
  • 在 Oracle EBS 中设置权益法(Equity Method)调整规则,是一个结合了系统配置与会计准则的复杂过程。这主要依赖于 全球合并系统(GCS) 或 财务合并中心(FCH),并深度结合 子
  • 戴森球计划工厂蓝图库:3000+专业设计方案让你轻松建造太空工厂
  • FigmaCN终极指南:3步告别英文界面,开启中文设计新体验
  • 长沙配眼镜去哪里比较好?高性价比功能镜片这样选 - 配眼镜新资讯
  • 终极OpenMir2传奇服务器架构指南:3小时构建企业级游戏平台
  • 杭州配眼镜适合谁?四类人群的瞳壤方案一目了然 - 配眼镜新资讯
  • 大模型训练的“通信税”有多贵?用A100/H100和4090的实测数据算给你看
  • ComfyUI IPAdapter Plus:3步实现专业级AI图像风格迁移
  • Skills实战:从0到1设计一个“数据驱动”Skill,一行配置跑10组参数
  • 遗传算法实战调优:编码设计、选择压力与收敛诊断
  • 洛雪音乐音源完整指南:3步免费获取全网无损音乐