思想:
方法一:
时间复杂度O(N),空间复杂度O(1)。
记reach为向右可跳的步数;
每次前进1步,并更新reach,看reach是否满足下面的两个条件:
(1)如果reach >= nums.size()-1 ,说明能跳出去,直接跳走;
(2)如果reach < 1,说明下一步没法跳了;
不满足条件要向前继续前进就reach--;
如果前进到了最后一个元素,返回true;
class Solution {
public:
bool canJump(vector<int>& nums) {
int reach = 0, i;
for(i=0; i<nums.size(); i++) {
if(i == nums.size()-1) return true;
reach = max(reach, nums[i]);
if(reach >= nums.size()-1) return true;
if(reach < 1) return false;
reach--;
}
return false;
}
};
方法二:
优化解法,直接看每一步所能到达的最远位置是否能出去即可。
class Solution {
public:
bool canJump(vector<int>& nums) {
int reach = 0;
for(int i=0; i<=reach && reach<nums.size()-1; i++) {
reach = max(reach,i+nums[i]);
}
return reach >= nums.size()-1;
}
};