方法一:贪心正推遍历
思想:就是不断遍历,然后看看能跳最远是多少,然后看看最远能不能到达最后一个
class Solution {
public:
bool canJump(vector<int>& nums) {
int reach=0; //初始化能够到达的点
int n=nums.size(); //n用于表示nums这个数组的长度
for(int i=0;i<n;i++)
{
//注意!下面两行代码顺序不能改变,因为最后一个数字可以不管
if(i>reach) return false; //如果能跳到的最远距离小于n的话,则false
reach=max(i+nums[i],reach); //选择可到达的最远距离
}
return true;
}
};
方法二:贪心正推遍历plus
思路:i<=reach表示:超过了reach我们遍历不到了,就无需遍历;
reach<n-1表示:已经能够达到最远距离了,就无需继续进行了。
class Solution {
public:
bool canJump(vector<int>& nums) {
int reach=0; //初始化能够到达的点
int n=nums.size(); //n用于表示nums这个数组的长度
for(int i=0;i<=reach && reach<n-1 ;i++)
{
reach=max(i+nums[i],reach); //选择可到达的最远距离
}
return reach>=n-1; //注意这里有所改变哦!
}
};
方法三:贪心倒推遍历
思路:其实我感觉和正推遍历差不多吧...只是把reach改为了last
class Solution {
public:
bool canJump(vector<int>& nums) {
int n=nums.size(); //n用于表示nums这个数组的长度
last=n-1; //表示最后到达的位置
for(int i=n-2;i>=0;i--)
{
if(i+nums[i]>=last) last=i; //表示最后能够到达的点
}
return last==0;
}
};