原题
原题
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:
输入: [2,3,1,1,4] 输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
说明:
假设你总是可以到达数组的最后一个位置。
解法
思想
- 动态规划,找到能到达最后一个位置的最靠左的点,然后把这个点设为新的要到达的位置,再找能到达这个点的最靠左的点,直到找到下标0为止。
- 贪心算法,每跳一次,在可跳范围内找能跳到的最远的地方,到达这个最远的地方时则步数加一。
代码
动态规划:
class Solution {
public int jump(int[] nums) {
int jumpTo = nums.length-1;
int count = 0;
while(jumpTo!=0){
for(int i = 0;i<jumpTo;i++){
if(i+nums[i]>=jumpTo) {
jumpTo = i;
count++;
break;
}
}
}
return count;
}
}
贪心算法:(来源:windliang)
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;
}
}
原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/leetcode45-%e8%b7%b3%e8%b7%83%e6%b8%b8%e6%88%8fii/