Description

Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Your goal is to reach the last index in the minimum number of jumps.

Example:

Input: [2,3,1,1,4]
Output: 2
Explanation: The minimum number of jumps to reach the last index is 2.
Jump 1 step from index 0 to 1, then 3 steps to the last index.

Note:

You can assume that you can always reach the last index.

分析

题目的意思是:给你一个数组,数组位置上的数代表能够走的最大长度,现在的目标是用最小的次数走到终点。

  • 贪心法,我们遍历当前跳跃能到的所有位置,然后根据该位置上的跳力来预测下一步能跳到的最远距离,贪心出一个最远的范围,一旦当这个范围到达末尾时,当前所用的步数一定是最小步数。
  • 我们需要两个变量curReach和maxReach分别来保存当前的位置和能到达的最远位置,用count来记录走的次数。
  • 如果位置i大于当前的位置最且小于能够到达的最远位置,说明我们要继续走,count++,把当前的位置置为能够到达的最大位置,然后每次最大位置都更新即maxReach=max(maxReach,i+nums[i])。
  • 最后,如果题maxReach没有到达末尾,返回-1,

代码

class Solution {
public:
int jump(vector<int>& nums) {
int curReach=0;
int maxReach=0;
int count=0;
int i=0;
int m=nums.size();
while(i<m&&i<=maxReach){
if(i>curReach){
count++;
curReach=maxReach;
}
maxReach=max(maxReach,i+nums[i]);
i++;
}
if(maxReach<m-1){
return -1;
}
return count;
}
};

代码二(python)

class Solution:
def jump(self, nums: List[int]) -> int:
cnt=0
cur=0
n=len(nums)
maxReach=0
for i in range(n):
if(cur<i):
cnt+=1
cur=maxReach
maxReach=max(maxReach,i+nums[i])
return cnt

参考文献

​[编程题]jump-game-ii​​​​[LeetCode] Jump Game II 跳跃游戏之二​