leetcode 55. Jump Game(C语言,跳数,递归思想,两种解法)20

贴原题:

Given an array of non-negative integers, you are initially positioned
at the first index of the array.

Each element in the array represents your maximum jump length at that
position.

Determine if you are able to reach the last index.

For example: A = [2,3,1,1,4], return true.

A = [3,2,1,0,4], return false.

解析:
  本题的意思……emmmm,看百度翻译吧……:)

给定一组非负整数,您首先定位在数组的第一个索引中。
数组中的每个元素表示您在该位置的最大跳转长度。 确定你是否能够达到最终指标。
For example:
A = [2,3,1,1,4], return true.
A = [3,2,1,0,4], return false.

  本题有个坑,像我这么傻第一次就跳进去了,我还奇怪为什么这么简单——题目中所说的最大跳转长度,照我理解,与弓箭、导弹的射程同义,意为每次跳转的数目可以小于这个最大跳转长度

  以下给出两种解题思路,具体算法思想我觉得我的注释写得很清楚了。

递归写法: (因时间超出被系统毙掉了)
  系统最后给的测试用例有25002个数,依次从25000到0,最后重复一个0。而本算法,经过我的测试,最多可以算“[27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,1,0,0]”(摊手~~)

bool jump(int* nums, int numsSize, int site)//递归函数
{
    if(site>=numsSize-1)//到达终点,跳出递归
    {
        return true;
    }
    for(int i=*(nums+site); i>0; i--)//最大跳转长度,意为可以小于这个长度
    {
        if(jump(nums, numsSize, site+i))//依次扫描每一步是否可以达到终点
        {
            return true;
        }
    }
    return false;
}
bool canJump(int* nums, int numsSize) {
    if(numsSize)
    {
        if(!jump(nums, numsSize, 0))
        {
            return false; //不能到达终点
        }
    }
    return true;
}

我称之为找规律偷懒写法:

bool canJump(int* nums, int numsSize) {
    for(int i=numsSize-2; i>=0; i--)//倒着查找
    {
        if(*(nums+i)==0)//在非终点处查找到0
        {
            //从0处向前搜索,如果在该0之前找不到比0到此数的距离大的数
            //即为跳不过去这个0,到达不了终点,返回false
            int flag=0;
            for(int j=i-1; j>=0; j--)
            {
                if(*(nums+j)>i-j)
                {
                    flag=1;
                    break;
                }
            }
            if(!flag)
            {
                return false;
            }
        }
    }
    return true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值