给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例 1:
输入: [2,3,1,1,4] 输出: true 解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。
示例 2:
输入: [3,2,1,0,4] 输出: false 解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
//解法一
bool canJump(int* nums, int numsSize){
if(numsSize<=1)return true;
bool * state=(bool *)malloc(sizeof(bool)*numsSize);
memset(state,0,sizeof(bool)*numsSize);
int end=numsSize-1;
state[end]=true;
for(int i=numsSize-2;i>=0;i--)
{
if(i+nums[i]>=end)
{
state[i]=true;
}
else
{
for(int j=i+nums[i];j>i;j--)
{
if(state[j])
{
state[i]=true;
break;
}
}
}
}
bool ret=state[0];
free(state);
return ret;
}
//解法二
bool canJump(int* nums, int numsSize){
if(numsSize<=1)return true;
int max_pos=0;
int end=numsSize-1;
for(int i=0;i<numsSize;++i)
{//判断i不可达
if(i>max_pos)continue;
max_pos=max_pos>nums[i]+i?max_pos:nums[i]+i;
if(max_pos>=end)
{
break;
}
}
return max_pos>=end;
}
解法一(暴力):
执行用时 : 724 ms, 在Jump Game的C提交中击败了16.40% 的用户
内存消耗 : 8.3 MB, 在Jump Game的C提交中击败了62.50% 的用户
解法二:
执行用时 : 12 ms, 在Jump Game的C提交中击败了98.41% 的用户
内存消耗 : 8.2 MB, 在Jump Game的C提交中击败了71.87% 的用户