力扣-55. 跳跃游戏

文章讲述了在给定数组中,通过递归策略判断从起始位置能否通过跳跃到达数组末尾的算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给你一个非负整数数组 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;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值