思想:
上一题用reach表示每一跳最远到达的位置,但是每一跳都按最远的跳不一定是最优路径(最少步数)。
但是有一个是很确定的:
如果当前位置超出了上一次算出的最远所能到达的位置reach,就必须step++,所以这里用一个range来记录上一次算出的最远所能到达的位置,即到了不得不跳的时候必须跳。
时间复杂度O(N),空间复杂度O(1)。
class Solution {
public:
int jump(vector<int>& nums) {
int range = 0;
int reach = 0;
int step = 0;
for(int i=0; i<nums.size(); i++) {
if(i>range) {
range = reach;
step++;
}
reach = max(reach, i+nums[i]);
}
return step;
}
};