题目描述:
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例 1:
输入: [2,3,1,1,4]
输出: true
解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。
示例 2:
输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
这个题目我刚开始用的是递归方法做的: 思路是从0到达nums.size()-1可以分解为 0 ->i ->nums.size()-1 ,然后再对各个元素分解。但是这种方法超时了。
因此又换了一种思路,求从0开始开始能够到达的最远距离,如果最远距离>=num.size()-1,返回true;否则,返回false。
算法的思路:
(1) .如果nums.size()<=1,return true;
(2). 定义far表示能到达的最远的距离,令far=0, 因为从0开始,肯定能到达0
(3). 从0开始循环直到倒数第二个元素。循环 i 内的内容为 : 判断far是否大于等于 i ,如果不是说明从之前无法到达本元素,返回false; 如果是说明至少能到达本位置,求far=max(far,i+nums[i]) 更新 far。判断far是否大于等于nums.size()-1,是的话返回true,否则返回false。
(4). 无法到达,返回false.
class Solution {
public:
bool canJump(vector<int>& nums) {
int far=0,length=nums.size();
if(length<=1) return true;
for(int i=0;i<length-1;i++)
{
if(far<i)
{
return false;
}
far=max(far,i+nums[i]);
if(far>=length-1)
{
return true;
}
}
return false;
}
};