题目
1.边界条件处理:
首先获取数组的长度 n,如果数组长度为 1,说明已经在最后一个位置,直接返回 true。
2.初始化最大可达位置: stepmax=0;
3.遍历数组
更新最大可达位置:stepmax = max(stepmax, i + nums[i]);
对于当前位置 i,计算从该位置能够跳到的最远位置 i + nums[i],并与之前记录的最大可达位置 stepmax 比较,取较大值更新 stepmax。
意味着当前位置行动最远后 可以到达的最远位置
3.1 判断是否能到达终点:
if (stepmax >= n - 1) { return true; }
如果最大可达位置已经能够到达或超过数组的最后一个位置(即 stepmax >= n - 1),说明可以跳到最后一个位置,返回 true。
3.2判断是否无法继续前进:
if (i == stepmax) { return false; }
如果当前位置 i 等于最大可达位置 stepmax,意味着无法再向前跳跃,返回 false。
当前可移动的最远位置仍等于当前位置 就无法继续前进
4.默认返回结果
在正常情况下,遍历完整个数组后
如果没有提前返回 false,说明可以到达最后一个位置,返回 true。
不过从逻辑上来说,这行代码实际上不会被执行,因为在遍历过程中要么提前返回 true,要么提前返回 false。
class Solution {
public:
bool canJump(vector<int>& nums) {
int n=nums.size();
if(n==1) {return true;}
int stepmax=0;
for(int i=0;i<n;i++){
stepmax=max(stepmax,i+nums[i]);
if(stepmax>=n-1){
return true;
}
if(i==stepmax){
return false;
}
}
return true;
}
};