LeetCode第55题:跳跃游戏

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。

 

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/jump-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法一 :无脑暴力求解

        用深度优先搜索的方法,跳到某一位置后,下一步跳到最远位置,依次递减到1。

如果当前位置超过终点,也说明能跳到终点,返回true。若从该位置往后跳,怎么都跳不到终点,返回false。

        优化时间:若已经知道从某一位置起跳,怎么都跳不动终点,可以将该位置记录下来。以后再次跳到该位置时可以直接返回false。用possi[]数组记录,possible[x] = 1表明该位置不可能跳到终点。

//深度优先搜索dfs
bool dfs(int* nums,int* possible,int n,int x){
    //可以跳到终点
    if(x >= (n - 1))
        return true;
    if( possible[x] == 0)
        return false;
    int max_jump = nums[x];
    for(int i = max_jump;i > 0;i--){
        if(dfs(nums,possible,n,x+i) == true)
            return true;
    }
    possible[x] = 0;
    return false;
}


bool canJump(int* nums, int numsSize){
    //possible数组记录调到某个位置后,是否还有可能到达终点
    //不可能的话直接退出,不然时间太久了
    int* possible = malloc(sizeof(int)*numsSize);
    for(int i = 0;i<numsSize;i++)
        possible[i] = 1;
    return dfs(nums,possible,numsSize,0);
}

        运行结果:

       

方法二:记录能跳到的最远位置

        一直维护能跳到的最远位置max_pos,刚开始时max_pos= 0;

        从0到max_pos遍历这个数组,并实时更新max_pos的值,当max_pos >= (n - 1),说明能跳到终点,返回true。

        某个位置 i 能跳到的最远位置为:i + nums[i],当这个值大于max_pos时,更新max_pos.

 

bool canJump(int* nums, int numsSize){
    //记录能跳到的最远位置
    //若最远位置超过终点,则能跳到终点
    int max_pos = nums[0];
    int temp;
    for(int i =0;i<=max_pos;i++){
        if(max_pos >= (numsSize -1))
            return true;
        //该位置能跳到的最远位置
        temp = i + nums[i];
        if(temp > max_pos)
            max_pos = temp;
    }
    return false;
}

运行结果如下:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值