问题描述:
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例1:
输入: [2,3,1,1,4] 输出: true 解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。
示例2:
输入: [3,2,1,0,4] 输出: false 解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
题意分析:要想判断能否到达最后一个位置就可以转换为判断判断起点和终点是否可达的问题,首先记录第一个位置(0下标处)的数字(假设为w),然后判断其之后的第i到w个位置上的数字加其下标所得到的值是否大于w,如果有大于的则将其赋值给w,并判断是否>=数组的大小,如果是则返回true;如果不是则继续循环(递归)上述的步骤,直到访问到倒数第二个元素为止,如果依旧不能,则返回false;
解题思路:LeetCode在时间复杂度上对代码有一定的要求,所以就采用了循环,当然也可以采用递归的方法来实现。
代码实现:
class Solution {
public:
bool canJump(vector<int>& nums) {
int answer=nums[0];
for(int i=1;i<nums.size();i++)
{
if(i<=answer)/*如果i代表的对应元素的下标 在上一个起始下标的单元内的数字的范围内,那么则可以将它能表示的范围加入nums[i]中,如果比answer大则代替answer*/
{
answer=(nums[i]+i)>answer?(nums[i]+i):answer;
if(answer+1>=nums.size())//还需要加上起始位置本身的位置
return true;
}
}
if(nums.size()==1)
return true;
return false;
}
};