代码随想录 Q88.跳跃游戏

思路:不要纠结当前位置元素究竟跳几步合适。以当前位置元素为3为例,也就是说,不用纠结在当前位置是跳一步、跳两步还是跳三步。而是考虑可跳的覆盖范围。每次取最大的跳跃步数,这个就是可跳的覆盖范围。只要在这个范围内,就一定可以跳过来。因此将该问题转化为跳跃覆盖范围究竟可不可以覆盖到终点。
贪心策略:每次移动取最大的跳跃步数(得到最大的覆盖范围)。每移动一个单位,就更新最大覆盖范围。
(1)局部最优解:每次取最大跳跃步数(取最大覆盖范围)。
(2)全局最优解:最后得到整体最大覆盖范围,看是否能到终点。
(3)局部最优可以推出全局最优,并且找不出反例,因此试试贪心。
如下图所示:
(1)i 每次只能在cover的范围内移动,每移动一个元素,cover得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。
(2)cover每次只取max(该元素数值补充后的范围,cover本身范围)。
(3)如果cover大于等于了终点下标,直接return true。

附代码:
class Solution {public boolean canJump(int[] nums) {if(nums.length == 1){return true;}//初始覆盖范围为0,因为下面的迭代从下标0开始。int cover = 0;//在覆盖范围内更新最大的覆盖范围。for(int i = 0;i <= cover;i++){cover = Math.max(cover,i + nums[i]);if(cover >= nums.length - 1){return true;}}return false;}
}
