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 }