给你一个非负整数数组 nums
,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。sd
判断你是否能够到达最后一个下标,如果可以,返回 true
;否则,返回 false
。
示例 1:
输入:nums = [2,3,1,1,4] 输出:true 解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2:
输入:nums = [3,2,1,0,4] 输出:false 解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
提示:
1 <= nums.length <= 104
0 <= nums[i] <= 105
思路分析:从0开始每一个跳点的值相加能够超过或者等于数组长度-1,则一定可以到达数组结尾。(对于每一个下标都可以这样递归思考,于是有以下分析)
对于能否跨过当前位置分析:
1.当前位置的值不为0时则一定可以跨过当前值。
2.当前位置的前一个位置的值加上前一个位置的小标是否超过当前位置(即但nums[i]的坐标为0时,当nums[i-1]+i-1 > i时一定可以跨过当前位置)。
3.重复递归第二步,直到找到能跨过当前位置的值为止,若找不到,且位置已经递归到0,则一定不能跨过当前位置。
代码成绩:
时间:80ms.击败 22.84%使用 C 的用户
内存:7.89MB.击败 67.58%使用 C 的用户
(我是菜鸟,这就去看解答)
bool canReach(int* nums,int* index,int result){
if(nums[*index]+(*index) > result){
//当index的值大于1时,可以跨过当前节点返回true
return true;
}else if(!(*index)){
//当index的值等于0(不能跨过当前节点)且当前节点为第一个节点时,返回false
return false;
}else{
//把index向前退一个位置,查看前面一个index和它的值相加后能否跨过当前节点
(*index)--;
return canReach(nums,index,result);
}
}
bool canJump(int* nums, int numsSize){
int result = 0;
while(result < numsSize-1){
if(canReach(nums,&result,result)){
result += nums[result];
printf("%d ",result);
}else{
break;
}
}
//结果判断
if(result >= numsSize-1){
return true;
}else{
return false;
}
}