题目
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
示例 1:
输入:nums = [2,3,1,1,4] 输出:true 解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2:
输入:nums = [3,2,1,0,4] 输出:false 解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
解题
方法一:贪心
贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。
i每次移动只能在cover的范围内移动,每移动一个元素,cover得到该元素数值(新的覆盖范围)的补充,让i继续移动下去。
而cover每次只取 max(该元素数值补充后的范围, cover本身范围)。
如果cover大于等于了终点下标,直接return true就可以了。
class Solution { public: bool canJump(vector<int>& nums) { int cover=0; for(int i=0;i<=cover;i++){ cover=max(i+nums[i],cover); if(cover>=nums.size()-1) return true; } return false; } };
循环i要从0开始,不能从1开始,因为有特例, [0] , 开始即终点.
java
class Solution { public boolean canJump(int[] nums) { int cur=nums[0]; int n=nums.length; for(int i=0;i<=Math.min(cur,n-1);i++){ cur=Math.max(cur,i+nums[i]); if(cur>=n-1) return true; } return false; } }