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

来源:互联网 发布:安信证券客户经理 知乎 编辑:程序博客网 时间:2024/06/15 23:57

贴原题:

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;}
原创粉丝点击