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.
解题思路:
本题从结果开始讲的话,会更好懂一点,假设nums有n个元素,最后到达这n个位置所需的步数分别为多少?最后的结果应该是前n1个需要1步,前n1-n2个需要2步,前n2-n3需要3步……以此类推。那现在的问题是如果求n2,n3……等分界线?
n1我们知道是起始位 0
n2应该是从起始位能到达的最远位置
n3应该是从n1-n2之间的某个位置,能到达的最远位置。
用cur记录当前能到达的最远位置,last记录上一段能到达的最远位置,当我们遍历到了last位置,则需要将last更新为当前的cur值。
class Solution {
public:
int jump(vector<int>& nums) {
int ans = 0, cur = 0, last = 0;
for(int i = 0; i < nums.size() - 1; ++ i){
cur = max(cur, i + nums[i]);
if(i == last){
last = cur;
++ ans;
if(cur >= nums.size() - 1)
break;
}
}
return ans;
}
};