题目
给定一个非负整数数组nums,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
说明:假设你总是可以到达数组的最后一个位置。链接
思路
- 暴力,从后往前找到下标最小能到当前
pos
的元素,初始设置pos=nums.length-1
,内嵌一层循环从下标0开始找,找到能到达pos
的元素更新pos
,并跳出循环。继续外层循环,直到pos=0
class Solution {
public int jump(int[] nums) {
int step=0;
int pos=nums.length-1;
while(pos>0){
for(int i=0;i<pos;i++){
if(i+nums[i]>=pos){
step++;
pos=i;
break;
}
}
}
return step;
}
}
- 贪心,由于题目保证总能到达终点,所以每次选择最远能到达的
pos
,并记录此次能到达的最远位置,设right=pos
从头遍历nums
,每次遍历时更新pos
。当循环到i==right
时,更新right=pos
。 - 遍历到
right
才进行step++
是因为当前元素所能到达的位置都已经遍历过,这其中的所有位置都能一步到达,然后right=pos
,然而存在pos
更新了两次,i
才遍历到right
准备更新的情况,不过这样也没有问题,因为right
之前的所有位置都能一步到达,即使其中有元素使得pos
的位置右移多次,那也可以两步到达该pos
。
class Solution {
public int jump(int[] nums) {
int step=0;
int pos=0;
int right=0;
for(int i=0;i<nums.length-1;i++){
pos=Math.max(pos,i+nums[i]);
if(i==right){
step++;
right=pos;
}
}
return step;
}
}