给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
说明:
假设你总是可以到达数组的最后一个位置。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/jump-game-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
本题思想贪心算法: 即找到该点跳出的最大长度
i-start+nums[i]
这样写超时
class Solution {
public int jump(int[] nums) {
//可以通过判断实际跳的距离加上能跳的最远 获得长度 每次选最大长度即可
// 2,3,1,1,4 从2 开始 跳到3 其长度为1+3 =4 跳到1 其长度为 2+1= 3 所以 跳到3 因为 可直接到结尾 所以返回2 即可
int start=0;
int count =0;
if(nums.length==1){
return 0;
}
while(start+nums[start]< nums.length-1){
start = getIndex(nums,start);
count++;
}
return count+1;
}
public int getIndex(int [] nums,int start ){
int max =0;
int index=0;
for(int i =start+1; i<start+nums[start];i++ ){
int len = i+nums[i]-start;
if(len > max){
max= len ;
index = i;
}
}
return index;
}
}
参考题解的写法:
class Solution {
public int jump(int[] nums) {
int end = 0;
int maxPosition = 0;
int steps = 0;
for(int i = 0; i < nums.length - 1; i++){
//找能跳的最远的
maxPosition = Math.max(maxPosition, nums[i] + i);
if( i == end){ //遇到边界,就更新边界,并且步数加一
end = maxPosition;
steps++;
}
}
return steps;
}
}