仅供自己学习
思路:
如何才能判断能走到最后一个下标呢,应该就是X= i+nums[i]>=nums.size()-1。所以我们遍历nums,每次都取 i+nums[i]最大的,如果 满足大于等于的条件就可以,但遍历的前提是,X > i,因为决定是否能到达最后的下标是由当前位置和当前元素的大小决定的,没有这个限制条件的话,当当前位置元素为0后,i仍然是在变大的,并且会影响X变大从而脱离了限制条件无法获得正确答案。加了这个前提,当最大跳到0元素的位置后就会停止并返回false
代码:
1 class Solution { 2 public: 3 bool canJump(vector<int>& nums) { 4 int size=nums.size(); 5 int x=0; 6 for(int i=0;i<size;++i){ 7 if(i<x){ 8 x=max(x,i+nums[i]); 9 if(x>=size-1) return true; 10 } 11 12 } 13 return false; 14 15 16 } 17 };
还有一种简便的写法,最大跳为X,那么当前位置 i 到 i+x的位置都可以作为起始跳的位置,那么就取最大的每个位置能跳的最远的那个位置并判断是否小于 i ,是则返回false,否则返回true。X小于i,说明最大跳已经遇到0元素无法继续往下跳也就无法到达最后的下标位置,那么就应该返回false
代码:
1 class Solution { 2 public: 3 bool canJump(vector<int>& nums) { 4 int size=nums.size(); 5 int x=0; 6 for(int i=0;i<size;++i){ 7 if(x<i) return false; 8 x=max(x,i+nums[i]); 9 10 11 } 12 return true; 13 14 15 } 16 };
原文:https://www.cnblogs.com/Mrsdwang/p/14418468.html