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 }

leetcode链接:https://leetcode-cn.com/problems/jump-game-ii/

posted @ 2021-05-04 22:14  没有你哪有我  阅读(73)  评论(0编辑  收藏  举报