本文共 1273 字,大约阅读时间需要 4 分钟。
为了解决这个问题,我们需要找到从数组的第一个位置到最后一个位置所需的最小跳跃次数。我们可以使用动态规划的方法来解决这个问题,从最后一个位置开始向前遍历,记录每个位置所需的最小跳跃次数。
初始化动态规划数组:我们创建一个数组 dp,其中 dp[i] 表示从位置 i 到达最后一个位置所需的最小跳跃次数。初始时,所有位置的值都设置为一个很大的数(表示未计算),最后一个位置的值设为 0,因为已经在终点。
从后向前遍历:从倒数第二个位置开始向前遍历到第一个位置。对于每个位置 i,我们检查从 i 出发的最大跳跃长度 step。如果 step 能够直接跳到最后一个位置,那么 dp[i] 设为 1。否则,我们从最大的跳跃长度开始,逐步减少,找到最小的跳跃次数。
更新最小跳跃次数:对于每个位置 i 和每个可能的跳跃步数 s,我们检查 i + s 位置的最小跳跃次数,并更新 dp[i]。
public class Solution { public int jump(int[] nums) { int n = nums.length; if (n == 1) return 0; int[] dp = new int[n]; for (int i = 0; i < n; i++) { dp[i] = Integer.MAX_VALUE; } dp[n - 1] = 0; for (int i = n - 2; i >= 0; i--) { int step = nums[i]; if (i + step >= n - 1) { dp[i] = 1; } else { for (int s = step; s >= 0; s--) { if (i + s < n && dp[i + s] + 1 < dp[i]) { dp[i] = dp[i + s] + 1; } } } } return dp[0]; }} dp 数组,长度与输入数组相同,所有元素初始化为 Integer.MAX_VALUE,最后一个位置设为 0。这种方法确保了我们能够以最少的跳跃次数到达数组的最后一个位置。
转载地址:http://uwzcz.baihongyu.com/