跳跃游戏II
核心思想:当前范围内走不到目的地,更新下一个范围。下一个范围是当前范围内能走到的最远点
class Solution { public: int jump(vector<int>& nums) { if (nums.size() == 1) return 0; int cover = 0; // 当前覆盖最远距离下标 int step = 0; // 记录走的最大步数 int nextcover = 0; // 下一步覆盖最远距离下标 for (int i = 0; i < nums.size() && i <= cover; i++) { nextcover = max(nums[i] + i, nextcover); // 更新下一步覆盖最远距离下标 if (i == cover) // 遇到当前覆盖最远距离下标 { if (cover < nums.size() - 1) // 如果当前覆盖最远距离下标不是终点 { step++; // 需要走下一步 cover = nextcover; // 更新当前覆盖最远距离下标 if (nextcover >= nums.size() - 1) break; // 下一步的覆盖范围已经可以达到终点,结束循环 } else break; // 当前覆盖最远距离下标是集合终点,不用做ans++操作了,直接结束 } } return step; } };
二刷
class Solution { public: int jump(vector<int>& nums) { int step = 0; int nextright = 0; int right = 0; for(int left=0 ; left<=right&&left<nums.size();left++) { nextright = max(nextright , left+nums[left]); if(left == right) { if(right != nums.size()-1) { step++; right = nextright; if(nextright >= nums.size()-1) break; }else break; } } return step; } };