LeetCode刷题——45. 跳跃游戏 II
题目描述
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
示例 1:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
示例 2:
输入: [2,3,0,1,4]
输出: 2
提示:
1 <= nums.length <= 1000
0 <= nums[i] <= 105
解题思路
dp简单粗暴
dp四步走:
1、状态:dp[i] 代表跳到第i个石头所需的最小步数
2、初始值:dp[0] = dp[1] = 0
3、转移方程:f[i] = Min{f[j] 1<=j<i} + 1;
4、计算并返回结果
DP代码
1 class Solution { 2 public int jump(int[] A) { 3 /* 4 这里容易忽视的一点,就是本来自己脚下的步数就已经可以直接跳到最后一个位置,但是因为我们 5 用的贪心法是找后面能跳过去的位置下的数字的最大值,然后跳到那个位置去,可是如果此时最后 6 一个位置的数小于前面的话,那么你就有可能跳在前面,这样就增加了跳的次数,也就不是用最少 7 次数到达数组的最后一个位置。 8 */ 9 if (A == null || A.length == 0 || A.length == 1) { 10 return 0; 11 } 12 13 int n = A.length; 14 15 int[] dp = new int[n + 1]; 16 dp[1] = 0; 17 18 for (int i = 2; i <= n; i++) { 19 dp[i] = Integer.MAX_VALUE; 20 for (int j = 1; j < i; j++) { 21 if (j + A[j - 1] >= i) { 22 // 从第j个石头能跳到第i个石头 23 // update 24 dp[i] = Math.min(dp[i], dp[j] + 1); 25 } 26 } 27 } 28 29 return dp[n]; 30 } 31 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能