给你一个非负整数数组 nums ,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
贪心算法:
既然总能跳到最后,那么我们就设置两个值,一个为最远距离,一个为当前距离,并当指针走到当前距离时,将其更新为最大距离,
为什么可以这样做呢?因为在更新最大距离时,我们之前走的那一步不一定是对的,但是也必然要走相同的步数,而当走到当前距离后,将当前距离更新为最大距离,就表示走路更新为了最优的那一步。
参考代码:
public int jump(int[] nums) {
if(nums.length==0||nums.length==1) return 0;
int cur=0;
int max=0;
int ret=0;
for(int i=0;i
if(max>=nums.length-1){
ret++;break;
}
if(i==cur){
cur=max;
ret++;
}
}
return ret;
}
动态规划:
分析:dp数组指到达当前格子所需的最小跳跃次数
如何得到?答:与之前可以到达此格的dp数组相比,取最小的
初始值?由于要取最小值,那么防止后面的数字干扰,除第一个dp值设为0外,其他数值均设为最大值
参考代码:
public int jump(int[] nums) {
int[] dp = new int[nums.length];
Arrays.fill(dp,Integer.MAX_VALUE);
dp[0]=0;
for(int i=1;i
dp[i]=Math.min(dp[i],dp[j]+1);
}
}
return dp[nums.length-1];
}
