前情提要:
因为本人最近都来刷贪心类的题目所以该题就默认用贪心方法来做。
贪心方法:局部最优推出全局最优。
如果一个题你觉得可以用局部最优推出全局最优,并且没有反例来反驳的话就可以用贪心来试试。
题目思路:
该题也不好入手,我们会纠结第一步跳哪,第二步跳哪,最终能不能跳到终点。
如果纠结某一步跳什么地方的话,那么这个题就很难想出来了。
其实我们可以换一个维度,我们直接找覆盖范围,遍历每一个元素,尽可能的去增加他的覆盖范围,只要覆盖范围能大于等于终点,就直接返回true。
局部最优:遍历每一个元素时,尽可能的增大覆盖范围
全局最优,达到最大覆盖范围
我们不用纠结怎么跳,只要能达到终点即可。
具体的代码细节我在代码部分讲。
最终代码:
class Solution {
public boolean canJump(int[] nums) {
//定义range变量表示范围
int range = 0;
//如果只有一个元素,肯定是可以跳到终点的
if(nums.length == 1)return true;
//注意这里i <= range很重要
//我们是要在覆盖范围内遍历我们的元素 再去增加我们的覆盖范围
//不在覆盖范围内去增加是没有意义的
for(int i = 0;i <= range;i ++){
//为什么这里取最大值很关键
//我要在我已有的覆盖范围内得到跳跃的长度用来增加我的覆盖范围
//range 每次只取 max(该元素数值补充后的范围, range 本身范围)。
//如果不取最大值 那么我的这个覆盖范围可能还会减小
//所以这个range要维护一个最大的覆盖范围
range = Math.max(i + nums[i],range);
//只要覆盖范围超过最后一个元素 则返回true
if(range >= nums.length - 1){
return true;
}
}
return false;
}
}
这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。
我很乐意为你解答。那么我们下篇再见!