# 跳跃游戏 II

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

示例:

输入: [2,3,1,1,4]
输出:
2
解释:
跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

说明:

假设你总是可以到达数组的最后一个位置。

以下错误的选项是?

## aop ### before ```cpp #include using namespace std; ``` ### after ```cpp int main() { Solution sol; vector nums = {2, 3, 1, 1, 4}; int res; res = sol.jump(nums); cout << res; return 0; } ``` ## 答案 ```cpp class Solution { public: int jump(vector &nums) { int res_min = 0; int end = 0; int longest_distance = 0; for (int i = 0; i < nums.size(); ++i) { longest_distance = max(longest_distance, nums[i]); if (i == end) { if (end != nums.size() - 1) { ++res_min; end = longest_distance; if (longest_distance >= nums.size() - 1) break; } else break; } } return res_min; } }; ``` ## 选项 ### A ```cpp class Solution { public: int jump(vector &nums) { int steps = 0; int lo = 0, hi = 0; while (hi < nums.size() - 1) { int right = 0; for (int i = lo; i <= hi; i++) { right = max(i + nums[i], right); } lo = hi + 1; hi = right; steps++; } return steps; } }; ``` ### B ```cpp class Solution { public: int jump(vector &nums) { if (nums.size() == 1) return 0; int steps = 0, oldIdx = 0; int nextJump = oldIdx + nums[oldIdx]; if (nextJump >= nums.size() - 1) return steps + 1; while (oldIdx < nums.size()) { int maxJump = 0, newIdx = oldIdx; for (int j = oldIdx; j <= oldIdx + nums[oldIdx]; j++) { int nextJump = j + nums[j]; if (nextJump >= nums.size() - 1) return steps + 2; if (j + nums[j] > maxJump) { maxJump = j + nums[j]; newIdx = j; } } oldIdx = newIdx; steps++; } } }; ``` ### C ```cpp class Solution { public: int jump(vector &nums) { int i, j, n = nums.size(); if (n == 1) return 0; int ans = 0; for (i = 0; i < n;) { if (i == n - 1) break; if (i + nums[i] >= n - 1) { ans++; break; } else { int max = i + 1; for (j = 2; j <= nums[i]; j++) { if (nums[max] + max <= nums[i + j] + i + j) max = i + j; } ans++; i = max; } } return ans; } }; ```