给定一个非负整数数组 nums
,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
示例 1:
输入:nums = [2,3,1,1,4] 输出:true 解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2:
输入:nums = [3,2,1,0,4] 输出:false 解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
解析:贪心的思路
其实跳几步无所谓,关键在于可跳的覆盖范围!
不一定非要明确一次究竟跳几步,每次取最大的跳跃步数,这个就是可以跳跃的覆盖范围。
这个范围内,别管是怎么跳的,反正一定可以跳过来。
那么这个问题就转化为跳跃覆盖范围究竟可不可以覆盖到终点!
每次移动取最大跳跃步数(得到最大的覆盖范围),每移动一个单位,就更新最大覆盖范围。
贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。
class Solution {
public boolean canJump(int[] nums){
int cover=0;//初始覆盖就是0
if (nums.length == 1)return true;
//cover是可以取到等号的
for (int i=0;i<=cover;i++){
//每次更新最大的可覆盖的范围;
cover=Math.max(cover,i+nums[i]);
if(cover>=nums.length-1){
//如果cover的覆盖范围大于nums.length-1,就是超过数组的index就直接返回true;
return true;
}
}
return false;
}
}
45. 跳跃游戏 II
给定一个长度为 n
的 0 索引整数数组 nums
。初始位置为 nums[0]
。
每个元素 nums[i]
表示从索引 i
向前跳转的最大长度。换句话说,如果你在 nums[i]
处,你可以跳转到任意 nums[i + j]
处:
-
0 <= j <= nums[i]
i + j < n
返回到达 nums[n - 1]
的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]
。
示例 1:
输入: nums = [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是2
。 从下标为 0 跳到下标为 1 的位置,跳1
步,然后跳3
步到达数组的最后一个位置。
示例 2:
输入: nums = [2,3,0,1,4] 输出: 2
解析:本题跟上一题的区别是,本题一定是可以到达终点的。
贪心的思路,局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最小步数。
思路虽然是这样,但在写代码的时候还不能真的能跳多远就跳多远,那样就不知道下一步最远能跳到哪里了。
所以真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数!
这里需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖。文章来源:https://www.toymoban.com/news/detail-410743.html
如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。文章来源地址https://www.toymoban.com/news/detail-410743.html
class Solution {
public int jump(int[] nums){
if(nums.length == 1) return 0;
int count=0;
int curdistance=0;
int nextdistance=0;
for (int i=0;i< nums.length;i++){
//下一步最大覆盖范围;
nextdistance=Math.max(nextdistance,i+nums[i]);
if (i == curdistance){
//如果index已经达到的了curdistance的下标,判断能不到达终点;
if (curdistance< nums.length-1){
count++;//步数加1
curdistance=nextdistance;//将下一跳的最大覆盖范围赋给curdistance;
}else {
//如果当前的覆盖范围已经可以达到终点,直接退出。
break;
}
}
}
return count;
}
}
到了这里,关于代码随想录:55. 跳跃游戏;45. 跳跃游戏 II的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!