这道题本来准备用递归加回溯的方法做,也就是每次都移动最大,看看能到哪里,如果走不通,再退回一步。这样的做法,通过了72个案例,最后一个案例超时,无法通过。于是思考了贪心的方法,判断每个地方可以到达的最远距离。将两次过程记录下来
第一次,
class Solution {
public:
bool canJump(vector<int>& nums)
{
if (nums.empty())
return false;
return isfinalpos(nums,0);
}
//当前位置为i可以跳到的地方
bool isfinalpos(vector<int> &nums, int i)
{
//出口
if (i >= nums.size() - 1)
return true;
//递归
for (int k = nums[i]; k >= 1; k--)
{
int pos = i + k;
if (isfinalpos(nums, pos))
{
return true;
}
}
return false;
}
};
上述方法太费时。
第二次 贪心的方法
class Solution {
public:
bool canJump(vector<int>& nums)
{
int dis=0;
int i = 0;
//i<=dis很重要,决定i是否在可以运动的范围内运动
for (; i < nums.size()&i<=dis; i++)
dis = max(dis, i + nums[i]);
if (i == nums.size())
return true;
else return false;
}
};