就题目而言,理解是比较容易的,解决这道题的思路是基础的贪心算法,每次都取最大的能到达的下标位置,代码如下:
class Solution {
public:
bool canJump(vector<int>& nums) {
int maxjump = 0;
int n = nums.size();
for(int i = 0;i < n;i++){
if(i <= maxjump){ //能跳到的范围内
maxjump = max(maxjump,nums[i] + i);//取跳的最远的距离
if(maxjump > n - 1)
return true;
}
}
return false;
}
};
当然改题也可以用从后向前遍历的算法,时间复杂度是一样的。
class Solution {
public:
bool canJump(vector<int>& nums) {
int n = 1;
for(int i = nums.size() - 2;i >= 0;i--){
if(nums[i] >= n){
n = 1;
}
else{
n++;
}
if(i == 0 && n > 1){
return false;
}
}
return true;
}
};
从后向前,如果当前位置能跳到最后位置,即能记下该位置并且更新目标距离n,最后判断当遍历到 i==0 时n的值,即可得到结果。