地址 https://leetcode-cn.com/problems/jump-game-ii/
给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 示例: 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
解答
由于题目要求是可以跳跃的最大长度而不是必须要跳的长度
那么 num[i]+i 是能达到的最远元素索引 那么他就可以包含其他选择所能达到的位置
所以我们使用贪心策略 每次选择 nums[i]+i 能达到最远的索引即可
道理很清晰 但是代码考虑到边界问题后 组织起来还是有一番难度的
class Solution { public: int jump(vector<int>& nums) { if (nums.size() == 1) return 0; int maxpos = 0; int step = 1; while (maxpos < nums.size() - 1) { if (nums[maxpos] + maxpos >= nums.size() - 1) return step; int maxr = -1; int maxidx = -1; for (int i = 1; i <= nums[maxpos]; i++) { int idx = maxpos + i; if (maxr < nums[idx] + idx) { maxr = nums[idx] + idx; maxidx = idx; } } maxpos = maxidx; step++; } return step; } };