当前位置: 首页 > 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.zskr.cn/news/1525504.html

相关文章:

  • 操作系统安全与端侧 AI 推理:从 TEE 到模型加密的防护链路
  • 2026年6月衢州GEO优化排名更新:谁是本地精准获客第一梯队? - 936品牌测评网
  • 英雄联盟Akari助手:5分钟打造你的专属智能游戏伴侣
  • 5个SillyTavern性能优化技巧:让你的LLM前端响应速度提升300%
  • 【多智能体控制】未知非线性仿射多智能体系统在扰动条件下数据驱动迭代学习积分滑动模式形成控制【含Matlab源码 15623期】
  • 终极OpenMir2传奇服务器架构指南:3小时构建企业级游戏平台
  • 大模型训练的“通信税”有多贵?用A100/H100和4090的实测数据算给你看
  • FigmaCN终极指南:3步告别英文界面,开启中文设计新体验
  • ComfyUI IPAdapter Plus:3步实现专业级AI图像风格迁移
  • 遗传算法实战调优:编码设计、选择压力与收敛诊断
  • Oracle EBS(E-Business Suite)的成本管理模块是支撑制造、供应链与财务一体化的核心。其整体设计哲学强调“业务流程驱动财务核算”
  • 【水下飞行器】水下飞行器操控系统UVMS任务优先运动学控制与双重操作【含Matlab源码 15624期】
  • 除了ArcGIS,还有哪些免费GIS工具能加载WMTS历史地图?QGIS/CesiumJS实测对比
  • 别再手动处理了!用ProCAST的Visual-Viewer高效导出节点温度/应力数据到PATRAN
  • 邮寄大件200斤收费标准?邮寄大件200斤啥价?2026收费标准全解析 - 快递物流资讯
  • 2026北京口碑实力前五美发学校全维度对比:零基础/进修/考证就业一站式择校指南 - 教育信息网
  • MPC8260 PCI桥I2O与DMA机制详解:解锁嵌入式通信性能
  • 武汉配眼镜怎么避坑?新手必看选店选镜指南 - 配眼镜新资讯
  • 终极指南:如何用Awesome-Dify-Workflow零代码构建AI工作流
  • 告别Excel依赖!用LibXL 4.2.0在.NET/C++项目中轻松读写Excel文件
  • 3分钟学会缠论可视化:通达信ChanlunX插件终极安装指南
  • 3分钟搞定抖音视频下载:免费工具全攻略
  • Umi-CUT:如何实现批量图片去黑边?简单高效的终极解决方案
  • 113、MIPI D-PHY 电气层测试:眼图、抖动、共模电压的测量标准与问题定位
  • 论文写作哪种AI好用?不同需求精准推荐 - 掌桥科研-AI论文写作
  • Android免Root框架终极指南:无需解锁Bootloader的模块化改造神器
  • 郑州配眼镜适合哪种方案?场景化选对不踩坑 - 配眼镜新资讯
  • 南京配眼镜怎么选镜片?从需求到验光一份完整指南 - 配眼镜新资讯
  • 112、MIPI CSI-2 协议层细节:ECC、Checksum、Virtual Channel、Data Type 字段解读
  • 免费开源!在线将 SQL 模式转换为交互式 ER 图,数据本地处理超安全