题目描述
给你一个非负整数数组 nums ,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
求解思路
顺瓜摸藤
- 由于我们要找的找到最少的跳跃数,所以应该要求满足跳跃的距离最大;
- 如果确定最后的一个数,在他的前面找索引最小的且能够跳到这个数的那个数;
- 比如这时候的target是数组最后的1,能满足跳到1的只有4和2,所以下一步就应该把4赋值给target;
- 接着再找能跳到4的索引最小的数字;
- 如何保证索引索引最小?将数组从左到右遍历就可以,第一个满足条件 i+nums[ i ] > target 的就是索引最小的数;
- 每往前找到一个数时,证明跨了一步,变量res+1;
- 最后返回res即可;
顺藤摸瓜
- 就上面这个例子来讲,从2开始跳,能跳到的节点有 3 和 1;
- 下面开始比较3 和 1 哪个能跳的更远,谁跳的远就选谁;
- 不难发现3 能够跳到4,而1 只能跳到1 ;
- 于是在3跳到4的过程中,还有1,1,4三个节点,就判断这三个节点哪个跳的更远,再就是哪个能跳到最后一个节点;
- 在代码实现的过程中,需要创建两个变量maxPosition表示当前遍历的点能够跳到的最远的距离,end表示上次跳跃可达范围的边界,如果当前跳到end,则end需要更新为当前节点能够跳的最远的距离maxPosition,同时res更新+1。
输入输出示例end
代码
顺瓜摸藤
class Solution {
public int jump(int[] nums) {
int n = nums.length;
int len = n - 1;
int res = 0;
while(len > 0){
for(int i = 0; i < len; i++){
if(i+ nums[i] >= len){
len = i;
res++;
break;
}
}
}
return res;
}
}
顺藤摸瓜
class Solution {
public int jump(int[] nums) {
int position = nums.length;
int maxPosition = 0;
int end = 0;
int res = 0;
for(int i = 0; i < position - 1; i++){
maxPosition = Math.max(maxPosition,i+nums[i]);
if(i == end){
end = maxPosition;
res++;
}
}
return res;
}
}