用最少的步数从1跳到n
(牛客网—牛客题霸算法篇—NC148)
题目描述
给定一个长度为 n 的数组 a。
ai 表示从 i 这个位置开始最多能往后跳多少格。
求从 1 开始最少需要跳几次就能到达第 n 个格子。
思路
Java实现
动态规划+贪心算法
dp[i]=dp[i-x]+1,其中x为当前能跳的格子个数
从前向后进行贪心
首先计算当前最远可到达位置(记为cur),如果当前位置i已经在上一个最远可到达位置(pre),说明下一步一定能够到达cur,此时steps加一,同时更新pre的值。
(比较难理解,可以自己定义一个数组,按照算法手动运行一遍)
代码实现
动态规划+贪心算法
import java.util.*;
public class Solution {
/**
*
* 最少需要跳跃几次能跳到末尾
* @param n int整型 数组A的长度
* @param A int整型一维数组 数组A
* @return int整型
*/
public int Jump (int n, int[] A) {
// write code here
int dp[]=new int[n+1];
dp[0]=0;
for(int i=1;i<n+1;i++){
dp[i]=i-1;
}
for(int i=2;i<=n;i++){
for(int j=0;j<n;j++){
if(i>=A[j]){
dp[i]=Math.min(dp[i],dp[i-A[j]]+1);
}
}
}
return dp[n];
}
}
从前向后进行贪心
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 最少需要跳跃几次能跳到末尾
* @param n int整型 数组A的长度
* @param A int整型一维数组 数组A
* @return int整型
*/
public int Jump (int n, int[] A) {
// write code here
int pre=0;
int cur=0;
int steps=0;
for(int i=0;i<n-1;i++){
cur=Math.max(cur,i+A[i]);
if(i==pre){
pre=cur;
steps++;
}
if(pre==n-1)
break;
}
return steps;
}
}