题目(leecode T45):给定一个长度为 n
的 0 索引整数数组 nums
。初始位置为 nums[0]
。
每个元素 nums[i]
表示从索引 i
向前跳转的最大长度。换句话说,如果你在 nums[i]
处,你可以跳转到任意 nums[i + j]
处:
0 <= j <= nums[i]
i + j < n
返回到达 nums[n - 1]
的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]
。
方法:本题和昨天的有相似之处但不完全一样,昨天的题目只要判断能否到达最后即可,而本题需要的是以最小的次数跳到最后位置,因此相比昨天的题目难度更大。但思路仍然是以最大覆盖范围做文章,我们遍历每个元素都能得到当前的最大覆盖范围,而当当前元素的最大覆盖范围到达不了最后位置时,我们就需要往下再走一步了,并再次计算下一步的最大覆盖范围,同时步数加1.一直重复这样的步骤,直到我们的步数可以到达最后位置就立即停止,当前的计数就是最小跳到最后位置的次数。
题解:
class Solution {
public:
int jump(vector<int>& nums) {
if (nums.size() == 1) return 0;
int curDistance = 0;
int ans = 0; // 记录走的最小次数
int nextDistance = 0;
for (int i = 0; i < nums.size(); i++) {
nextDistance = max(nums[i] + i, nextDistance); // 更新下一步覆盖最远距离下标
if (i == curDistance) { // 遇到当前覆盖最远距离下标
ans++; // 需要走下一步
curDistance = nextDistance; // 更新当前覆盖最远距离下标(相当于加油了)
if (nextDistance >= nums.size() - 1) break; // 到达最后位置
}
}
return ans;
}
};